2012-10-28 82 views
1

有時可可允許用戶無論是NSOperationQueue或dispath_queue_t傳遞給異步方法:我應該爲異步方法使用什麼簽名?

+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] 
-[AVPlayer addBoundaryTimeObserverForTimes:queue:usingBlock:] 
-[NSNotificationCenter addObserverForName:object:queue:usingBlock:] 

有時並不:

-[NSDocument continueActivityUsingBlock:] 
-[NSSavePanel beginWithCompletionHandler:] 
-[GKAchievementDescription loadImageWithCompletionHandler:] 

對我來說,通過隊列的方法看起來模糊的,因爲您可以在創建塊時始終抓住所需的隊列。例如:

NSOperationQueue *q = …; 
[aDocument continueActivityUsingBlock:^{ 
    [q addOperationWithBlock:^{ 
     // Do actual work here. 
    }]; 
}]; 

也許我失去了一些東西,傳遞隊列有意義嗎?

回答

4

取決於。

完成後需要回調嗎?

如果是這樣,您可能需要指定一個隊列。類型 - NSOperationQueue與GCD隊列 - 取決於您。

但是,如果你定義你的回調爲任何總是被主隊列(這將是適當的回調是總是要更新大量的用戶界面),或者是調用總是將是異步調用(即通常將回調調度到異步隊列中),那麼沒有理由通過目標隊列。

如果您的回調是期望它可能與其操作必須被序列化的數據交互的回調,那麼定義一個提供序列化原語的API(一個隊列)可能是一個強大的捷徑。

+0

謝謝。我現在清楚地看到,那些需要隊列的方法可以按順序執行傳遞塊。 – Kentzo

相關問題