我有一个自定义控件,其数据源类似于UITableView的工作方式。我还添加了一个重新加载数据函数来加载新数据。
我希望每个运行循环调用一次重新加载数据实现,以避免多次重新加载相同的数据。
这是我当前的实现:
func reloadData(){
guard reloadDataScheduled == false else{
return
}
self.reloadDataScheduled = true
NSRunLoop.currentRunLoop().performSelector("innerReloadData", target: self, argument: nil, order: 0, modes: [NSDefaultRunLoopMode])
}
innerReloadData 是一个私有函数,它实际执行加载,并将 reloadDataScheduled 设置为 false。
这似乎在大多数情况下都有效,但其他情况下它似乎延迟超过 2 秒,这不是我想要的。
我需要深入了解运行循环的延迟或有关如何实现这种实现风格的任何建议。
在这种情况下
,我通常使用以下代码。
- (void)setNeedsReloadData
{
// cancel all previous schedules
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reloadData) object:nil];
// below codes schedule "immediately run after current fetching on runloop"
[self performSelector:@selector(reloadData) withObject:nil afterDelay:0];
}
- (void)reloadData
{
// cancel the others schedules
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reloadData) object:nil];
// Reload Data
...
}
您可以随时致电-[XXX setNeedsReloadData]
。 每次在运行循环上获取reloadData
将运行一次。
在斯威夫特中
- 在 SWIFT 1.1 之前 -
[NSObject performSelector: withObject: afterDelay:]
被阻止。 - 在 swift 2.0 之后 - 现在允许使用。