因此,在瞭解完成塊之後,我很喜歡使用完成塊。我喜歡關閉,我喜歡在任何地方傳遞任何想要的東西的能力。關於使用完成塊排隊
作爲線程編程的新手,我一直在遠離GCD和NSOperation - 但最近我不得不編程異步更新到核心數據的東西,我開始懷疑我的「全部完成阻止所有的時間「的方法。
所以這裏是我自問的一個例子:我有一系列可能相當大的數據(圖像,聲音,視頻,你有什麼)上傳到服務器的地方。這些數據的元數據存儲在覈心數據中,並且我有一個時間戳用於決定應該上傳哪些對象。所有這些上傳應該按順序進行。
我所編碼的是一種本質上基本上是一個在它完成塊,在該塊的一端有一個電話給自己,這樣的功能:
(void)uploadAllAsynchronously {
... // First figure out what to upload based on core data
// Here comes the completion block in question
void(^blk)(BOOL) = ^(BOOL)uploadSuccess {
... // if upload successful, update core data to mark what has been uploaded
[self uploadAllAsynchronously]; // Recursively calls the function that contains this block. I actually have a weak self, or if that fails to break a retain cycle, I should be able to pass in a NSManagedObjectContext as an argument.
}
[NSURLConnection sendAsynchronousRequest:... queue:... completionHandler:blk];
}
這應該工作,對不對?有沒有什麼東西是完全危險的,這表明我必須使用GCD並處理我自己的隊列?我問這是因爲我現在有點麻煩,可能數據中會出現不同的線程,由於異步調用而不能正確更新,但不知道我的代碼的哪一部分是罪魁禍首。
在此先感謝。
請記住,完成處理程序通常不會在後臺線程上運行。通常(包括'[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]')完成塊在主線程上執行。所以你根本不用擔心線程安全。如果主線程在後臺線程完成下載時處於繁忙狀態,則在執行完成塊之前,主線程將處於空閒狀態。 –
我發現有一種情況嵌套完成塊會有問題,並可能導致死鎖:http://www.cocoawithlove.com/2010/06/avoiding-deadlocks-and-latency-in.html – Victor