#iphone #objective-c #cocoa-touch #ios #ipc
#iPhone #objective-c #cocoa-touch #iOS #ipc
Вопрос:
Я хочу знать, как дочерний поток может взаимодействовать с родительским потоком в Objective C. Я создаю поток из моего основного потока и хочу сообщить основному потоку о некотором действии и продолжить. Как этого добиться?
Комментарии:
1. Вам нужна межпроцессная или внутрипроцессная коммуникация? Ваш вопрос на самом деле не соответствует его названию.
2. Основной поток не обязательно является родительским потоком. Легко получить основной поток. Я все еще не нашел никакого способа получить родительский поток.
Ответ №1:
- Если вы разместите NSNotification в дочернем потоке, получатель получит уведомление и выполнит его под
the same thread
именем отправителя. Об этом говорится в документе Apple и помечено как примечание. - Информация между потоками может передаваться с помощью общей памяти, например: структуры, примитивных типов (int, CGFloat и т.д.).
-
Информация между потоками может передаваться с помощью свойства threadDictionary NSThread. Я предпочитаю использовать это для регистрации некоторых переменных состояния. Например, при прокрутке я буду устанавливать следующее.
NSMutableDictionary *dictInfo = [NSThread mainThread].threadDictionary; [dictInfo setObject:[NSNumber numberWithbool:YES] forKey:_kThreadPause];
Рабочий поток перейдет в спящий режим, когда увидит, что для _kThreadPause установлено значение YES.
BOOL bPause = [[[NSThread mainThread].threadDictionary objectForKey:_kThreadPause] boolValue]; if (bPause) [NSThread sleepForTimeInterval:0.1];
-
Как сказал Дэвиднисс, вы можете использовать методы NSObject для выполнения селектора в главном потоке или дочернем потоке.
Если у вас есть время, вы можете прочитать руководство по многопоточному программированию.
Комментарии:
1. Другой вариант — создать и инкапсулировать поток с помощью NSOperation.
Ответ №2:
Обычно у вас есть другой поток, который запускает селектор обратно в главном потоке и делится информацией через ivar.
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
Ответ №3:
Вы можете попросить поток опубликовать NSNotification, которое прослушивает (наблюдает) основной поток, и передать информацию в объекте NSNotification.