2013-12-15 56 views
1

在某些情況下,當某些事件快速連續接收到多個刷新調用時,例如: - ViewController接收到多個KVO通知。 - 從setters調用的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]; 
    } 
} 

是否有這類問題的一個更好的解決辦法?

回答

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; 
     }); 
    } 
} 
+0

感謝您的答覆,但該方案丟棄在更新過程中收到的最後一個請求。但我現在正在使用調度塊。 –

相關問題