Objective-C, NSThread отделяется от executeSelectorInBackground - PullRequest
1 голос
/ 21 марта 2011

В чем различия между этими двумя?

 [NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil];
 [self performSelectorInBackground:@selector(method) withObject:nil];

Обычно я использую второй метод для создания нового потока. Но мне было интересно, если я вызову это дважды, как показано ниже в методе, то что произойдет? Кроме того, если у меня есть вкладка, и каждое меню порождает тему, то какую мне следует использовать?

 [self performSelectorInBackground:@selector(method1) withObject:nil];
 [self performSelectorInBackground:@selector(method2) withObject:nil];

1 Ответ

6 голосов
/ 21 марта 2011

Они идентичны. Вот что говорит официальная документация по этой теме:

В iOS и Mac OS X v10.5 и выше, все объекты имеют способность порождать новый поток и использовать его для выполнения одного их методов. performSelectorInBackground: withObject: метод создает новый отдельный поток и использует указанный метод в качестве точка входа для новой темы. За Например, если у вас есть какой-то объект (представлен переменной myObj) и этот объект имеет метод с именем сделать то, что вы хотите запустить в фоновый поток, вы могли бы использовать следующий код для этого:

[myObj performSelectorInBackground: @selector (йоЗотеЬЫпд) withObject: ноль];

Эффект звонка этот метод такой же, как если бы вы называется detachNewThreadSelector: toTarget: withObject: метод NSThread с текущим объект, селектор и параметр объекта в качестве параметров. Новая тема порождается сразу, используя по умолчанию Конфигурация и начинает работать. Внутри селектора вы должны настроить поток так же, как вы бы любая нить. Например, вы бы необходимо настроить пул авто-релиза (если вы не использовали сборщик мусора) и настройте цикл выполнения потока, если Вы планировали использовать это. Для информации о том, как настроить новые темы, см. «Настройка атрибутов потока».

Что касается того, что произойдет, если вы сделаете:

[self performSelectorInBackground:@selector(method1) withObject:nil];
[self performSelectorInBackground:@selector(method2) withObject:nil];

... вы создадите два новых потока, один из которых начнет выполняться с method1, а другой - с method2. Потоки могут выполняться одновременно (т. Е. Второй не будет ожидать завершения первого, прежде чем он начнет выполняться).

...