0

我要做到以下幾點:NSNotification和控制流

1. display loader 
2. download database update and reload data 
3. hide loader 

我的想法是,在開始時,在數據庫的更新方法的主視圖控制器的結束髮送通知,從而使視圖控制器顯示並隱藏裝載機。

我很擔心控制流程。我有沒有保證視圖控制器會在數據庫的更新方法進行之前收到通知並顯示加載器?

+0

我不會使用通知。塊和調度庫提供了一個更清晰的方法。看到我的答案。 – CouchDeveloper

回答

2

通知在系統中排隊,所以不能保證它會立即生效。無論如何,它們通常都很快,肯定比數據庫上的工作快。

如果您想100%確定,只需在某處設置標誌,並在收到通知時檢查數據庫是否已重新加載。

無論如何,我只是想,即使數據庫重裝後收到通知,因爲通知已排隊,隱藏加載器通知會在第一個通知後面出現,所以沒有什麼可擔心的關於。

+0

我不認爲一面旗幟會有幫助;你需要的是*保證*通知的執行將被*序列化*。您可以使用原子操作,只是假設發佈對象正在使用某個線程,或者您可以使用需要NSOperationQueue的'addObserverForName:object:queue:usingBlock:'註冊觀察者。這很麻煩或脆弱。 ;) – CouchDeveloper

0

一般你會希望視圖 - 控制開球更新,所以只要你確保你設置的聽衆之前後(更新的開球),並您的視圖 - 控制已經完全加載,你應該精細。 (即開始viewDidAppear更新)

0

您可以實現它類似如下:

- (IBAction)updateDatabase:(id)sender { 
    __block MyController* blockSelf = self; 
    __weak MyController* weakSelf = self; 
    [self startBusyIndicator]; 
    [self asyncDownloadDatabase:^(id result, NSError*error) { 
     if (error == nil) { 
      [blockSelf.database updateWithData:result]; 
     } 
     blockSelf = nil; 
     MyController* strongSelf = weakSelf; 
     if (strongSelf) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [strongSelf reloadData]; 
       [strongSelf stopBusyIndicator]; 
      }); 
     } 
    }]; 
} 

使用blockSelf保證控制器保持活動狀態後asyncDownloadDatabase結束,數據庫更新,直到。假定更新過程可以在任何線程上執行。

weakSelf將僅變爲零,並且直到在blockSelf設置爲零之後立即變爲零,如果這是控制器的最後引用 - 例如,用戶已切換到另一個視圖。在這種情況下,將不會更新視圖 - 它們已被釋放。否則,如果控制器仍然存在,視圖將被更新。