1
我定義了一個名爲'AsyncNetworkOperation'的類,它是NSOperation的一個子類,用於在我的應用程序中執行數據庫查詢。我AsyncNetworkOperation類有一個協議,由該啓動AsyncNetworkOperation對象使用:使用主線程而不是輔助線程回調委託?
@protocol AsyncNetworkOperationDelegate
@optional - (void)operationAboutToFinish;
@required - (void)operationFinishedWithData:(id)retrievedData;
@required - (void)operationFinishedWithError:(NSError*)error;
@end
這一切工作正常,但在我打電話回代表要顯示UIAlertView中的情況下,啓動NSTimer,或者做一些輔助線程要麼不應該做的事情,要麼做額外的工作。
所以這裏是我的問題:當我回調委託,我應該通過 - [NSObject performSelectorOnMainThread:]?看起來這樣做可以讓我的委託人不必知道它是通過二級線程還是主線程回叫,從而允許它以最直接的方式實現功能,而沒有任何限制。
只是想知道解決這個問題的標準方法。
謝謝。
這樣做的最好方法是什麼?我最好的猜測:1)當異步操作開始時,調用+ [NSThread currentThread]來獲取調用該操作的線程。存儲在一個實例變量中。 2)當操作完成後,使用 - [NSObject performSelector:onThread:withObject:waitUntilDone:]調用委託,通過onThread:參數傳遞存儲的線程。這看起來是否正確,還是有更乾淨的方式?謝謝。 – 2010-01-19 21:18:44
@Greg,如果你真的自己創建線程,這聽起來是正確的。否則,可能不需要。 – notnoop 2010-01-19 21:20:09
我只是實例化一個NSOperation並將其添加到NSOperationQueue。這是你「自己創建線程」的意思嗎? (我問這只是因爲一些Cocoa文檔幾乎似乎暗示使用NSOperation是一種繞過創建線程的方式......當我瞭解它的真正方式時,NSOperationQueue爲我創建了一個線程。) – 2010-01-19 21:32:29