在某些情况下,当某些内容快速连续接收到多个刷新调用时,我已经遇到过,例如: - ViewController接收多个KVO通知。 - 当多个设置更改时,从setter调用的Datamanger类。
理想情况下,我只想执行系列中的最后一次刷新调用(删除所有中间调用)。
现在我使用isRefreshing属性和needRefresh来阻止过度刷新,例如:
- (id)init {
...
[self observeValueForKeyPath:@"isRefreshing" ....];
}
- (void)setParameter:(NSInteger)parameter {
....
[self refresh];
}
/* and many more kinds of updates require a refresh */
- (void)setAnotherProperty:(NSArray*)array {
....
[self refresh];
}
- (void)refresh {
if (self.isRefreshing) {
self.needRefresh = YES;
return;
}
self.isRefreshing = YES;
...
self.isRefreshing = NO;
}
- observeValueForKeyPath..... {
if (!self.isRefreshing && self.needsRefresh) {
self.needsRefresh = NO;
[self refresh];
}
}
这种问题有更好的解决方案吗?
答案 0 :(得分:1)
您可以创建一个并发设置为1的NSOperationQueue
,并在其操作计数为零时仅向其提交新操作。 (或者使用取消逻辑删除待处理作业,以便在正在进行作业时只有一个新作业排队。)
您正在做的事情对于单线程系统来说是合理的,但对于多线程来说会变得相当复杂。
答案 1 :(得分:0)
看起来你应该延迟刷新一段时间。 您可以使用不同的技术来完成此操作。只有一面旗帜就足够了。 例如,您可以使用异步块来延迟一个主运行循环周期
- (void)setParameter:(NSInteger)parameter {
....
[self requestRefrhesh];
}
- (void)setAnotherProperty:(NSArray*)array {
....
[self requestRefrhesh];
}
...
-(void) requestRefrhesh {
if (self.refreshRequested) {
return;
} else {
self.refreshRequested = YES;
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run in main UI thread
//make your UI changes here
self.refreshRequested = NO;
});
}
}