2010-08-18 183 views
0

嘿,我在多線程中遇到問題。 爲了描述這一點,我有兩個線程。 在主線程上,我有一些邏輯 而在另一個線程上,我有一個邏輯和一些用於UI的邏輯來更新UI。 我想要做的是在另一個線程上的UI更新後,我想調用某種方法。 我想我應該使用NSOperationQueue什麼的。或後臺隊列。 但我已閱讀併發編程和線程指南,我仍然不知道如何去做。多線程問題(UI未更新)

那麼如何做到這一點,以便我可以在線程完成後調用方法? 謝謝!

回答

3

您不應該從主線程以外的任何線程觸摸UI。線程之間發送形式交往的兩種簡單的方法:

performSelector:

[someObject performSelectorOnMainThread:@selector(someSelector) withObject:nil waitUntilDone:NO]; 

聲明:

NSNotification *notification = [NSNotification notificationWithName:@"myNotification" object:nil]; 
[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:NO]; 

你當然也可以使用一個NSOperationQueue和鍵 - 值觀察作業的成品性能,但除非您因其他原因需要它,否則會增加不必要的複雜性。

+0

NSNotifications他們在從被張貼在同一線程上收到的,所以第二個例子中需要使用performSelectorOnMainThread:爲好。 (和一個小的錯字@selector(postNotification)缺少':'。) – 2010-08-18 14:40:40

+0

我很肯定KVO也在同一個線程上運行,所以你要執行SelectorOnMainThread: – JeremyP 2010-08-18 15:37:40

+0

@Vincent Gable:你不需要選擇器末尾的冒號。從文檔:該方法不應該有一個顯着的返回值,應該採用類型id,**或沒有參數**的單個參數。 http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050-CJBEHAEF – JeremyP 2010-08-18 15:39:14

0

這裏是最好的方式,如果你使用的是iOS 4.0:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // update the UI here... 
});