NSNotification и NSThread

Я создаю объект в отдельном потоке, используя NSThread.

NSThread* myThread = [[[NSThread alloc] initWithTarget:self selector:@selector(createNewObject:) object:elements] autorelease];
[myThread start];  // Actually start the thread

Этот объект ожидает события. Когда это событие происходит, уведомление публикуется в центре уведомлений по умолчанию.

Мой AppController наблюдает за этим уведомлением и запускает селектор.

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self selector:@selector(myMethod:) name:MyNotification object:nil];

Вопрос. Выполняется ли метод (myMethod:) из селектора в основном потоке или в потоке сверху (myThread)?


person Daniel    schedule 24.11.2011    source источник


Ответы (1)


В той же теме, в которой вы публикуете уведомление.

В многопоточном приложении уведомления всегда доставляются в потоке, в котором было опубликовано уведомление, который может не совпадать с тем потоком, в котором зарегистрировался наблюдатель. (Источник )

Сноска. Объекты не могут ждать событий. Объекты просто существуют. Методы могут ожидать событий.

person Dietrich Epp    schedule 24.11.2011
comment
Спасибо!!! (Говоря о ожидании события, я имел в виду, что оно реагирует на взаимодействие с пользователем. Извините за неясность.) - person Daniel; 25.11.2011
comment
Кстати: есть ли способ выяснить имя потока, который запускает определенный метод? - person Daniel; 25.11.2011
comment
@Daniel: У тем на самом деле нет названий. Кроме основного потока, то есть. - person Dietrich Epp; 25.11.2011
comment
Я имею в виду потоки, которые я создал сам, или основной поток. Например, не должно быть имя NSThread *myGreatThread; быть моей GreatThread ? - person Daniel; 25.11.2011
comment
Если я пишу int x = 3, это не значит, что имя 3 — x. Возможно, вам стоит просмотреть вводный учебник по программированию? - person Dietrich Epp; 25.11.2011
comment
Нет, конечно нет ;) Я снова был неясен. Тем временем я узнал, что вы можете установить имя для потока. С помощью [NSThread currentThread] вы можете узнать текущий поток выполнения. developer.apple.com/library/mac/documentation/Cocoa/Reference/ - person Daniel; 25.11.2011
comment
Вы также можете назвать pthreads, используя pthread_setname_np. В Lion или более поздних версиях -[NSThread setName:] вызывает это, поэтому имя потока будет отображаться в образцах, журналах сбоев и т. Д. - person Catfish_Man; 25.11.2011
comment
Хм, кажется, это расширение. - person Dietrich Epp; 25.11.2011
comment
@Daniel: в NSThread *myGreatThread поток не называется myGreatThread, переменная, которая может содержать указатель на поток, называется myGreatThread. Вы можете назвать поток, как вы уже нашли, но вы должны сделать это самостоятельно, отправив сообщение объекту потока, чтобы установить имя объекта потока. - person Peter Hosey; 25.11.2011