2016-02-19 62 views
0

我使用NSURLSession使多個異步請求到我的服務器與下面的代碼:設置的NSMutableDictionary多個鍵/值對NSURLSession repsonse塊

[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    ... 
    [self.dict setObject:some_obj forKey:some_key]; 

}] resume]; 

內響應塊我設置的鍵/值配對可變字典。

我的問題是: 由於請求是異步的,理論上我的程序是否會嘗試同時爲字典設置鍵/值對?如果這是可能的,會發生什麼?

  1. 該應用程序崩潰了嗎?
  2. 未定義某些鍵/值對嗎?
  3. 或者它會工作,因爲一個鍵/值設置將等待另一個完成?

如果3.不是這樣,我能做些什麼使3)工作?

回答

0

NSMutableDictionary沒有記錄爲線程安全的,所以它幾乎肯定不是。

然而,Apple docs on NSURLSession說:

完成處理負載請求完成時調用。該處理程序在委託隊列上執行。

你(可以)通過在會話創建委託隊列,文檔說:

調度委託調用和完成處理的操作隊列。隊列不必是串行隊列。如果爲零,會話將創建一個串行操作隊列以執行所有委託方法調用和完成處理程序調用。

因此,只要設置密鑰,如果你沒有顯式創建與並行隊列的會話,你應該沒問題。如果你這樣做了,那麼你需要同步訪問。最簡單的方法是@synchronized塊:

@synchronized (self.dict) { 
    self.dict[key] = value; 
} 

取決於何時何地,你正在閱讀的價值,您可能需要反正同步塊。

+0

感謝您的回答。我在我的類的接口中聲明瞭一個(nonatomic,assign)int計數器屬性。在完成處理程序塊中,我使用self.counter--減少計數器屬性。我是否也需要'@synchronized {self.counter - }'int計數器屬性? – user2415476