Внутрипроцессная коммуникация в Objective C

#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.