我有一个自定义控件,其数据源类似于UITableView的工作方式。我还添加了一个reloadData函数来加载新数据。
我希望每个运行循环调用一次重载数据实现,以避免多次重新加载相同的数据。
这是我目前的实施:
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秒,这不是我想要的。
我需要深入了解runloop的延迟或者有关如何实现这种实现方式的任何建议。
答案 0 :(得分:3)
在这种情况下,我通常会使用以下代码。
- (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]
。
每次在runloop上获取时,reloadData
将运行一次。
PS。在SWIFT
[NSObject performSelector: withObject: afterDelay:]
被阻止了。