2010-08-18 3 views
0

Эй, у меня проблема в многопоточности. Чтобы описать это, у меня есть два потока. В основном потоке у меня есть некоторая логика И в другом потоке у меня есть логика и некоторая логика для UI, который будет обновлять интерфейс. Что я хочу сделать, так это то, что я хочу вызвать некоторый метод после обновления пользовательского интерфейса в другом потоке. Я думаю, что я должен использовать NSOperationQueue или что-то в этом роде. или фоновой очереди. , но я прочитал руководство по параллелизму и руководство по потокам, и я до сих пор не знаю, как это сделать.Проблема многопоточности (UI не обновляется)

Как это сделать, чтобы я мог вызвать метод после завершения потока? спасибо!

ответ

3

Вы никогда не должны касаться пользовательского интерфейса из любой нити, кроме основной. Два простого способ отправки messsages между потоками:

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 и Key-Value-Наблюдайте законченное свойство задания, в но если вам это не понадобится по другим причинам, это просто добавляет излишней сложности.

+0

NSNotifications получены на том же потоке, что они были размещены с, так что второй пример должен использовать performSelectorOnMainThread: а. (И в одном маленьком опечатке @selector (postNotification) отсутствует ':'.) –

+0

Я уверен, что KVO работает и в том же потоке, поэтому вы не выполняетеSelectorOnMainThread: – JeremyP

+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

0

Вот самый хороший способ, если вы используете IOS 4.0:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // update the UI here... 
}); 
Смежные вопросы