排队调用刷新数据的好方法是什么?

时间:2013-12-15 12:46:17

标签: ios iphone

在某些情况下,当某些内容快速连续接收到多个刷新调用时,我已经遇到过,例如: - 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];
    }
}

这种问题有更好的解决方案吗?

2 个答案:

答案 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;
        });
    }
}