2010-11-21 6 views
2

В чем разница между использованием этогоiPhone - нити

[self performSelectorOnMainThread:@selector(doStuff:) 
         withObject:myObject 
        waitUntilDone:YES]; 

вместо того, чтобы просто

[self doStuff:myObject]; 

с точки зрения загрузки процессора? Или есть другие преимущества?

спасибо.

ответ

2
[self performSelectorOnMainThread:@selector(doStuff:) 
        withObject:myObject 
       waitUntilDone:YES]; 

Это гарантирует, что селектор выполняется в основном потоке, добавив его в основной цикл цикла. Когда вы установите waitUntilDone:YES, вы пропустите свой текущий поток, пока цикл основного запуска должен выполнять селектор. В однопоточной среде это позволит запустить runloop сразу после того, как вы это вызвали, в многопоточной среде основная runloop выполнит селектор, как только он сделает следующий шаг.

Вы в любом из обоих случаях небольшие накладные расходы, как селектор не выполняется сразу после вызова функции, но на более позднем этапе, а [self doStuff:myObject]; выполняет селектор сразу

+0

спасибо !! Я был очень подозрительным! – SpaceDog

+0

Извините, ребята, но это было не так точно. Если вы вызываете это из основного потока, метод будет выполняться немедленно, потому что параметр 'waitUntilDone: YES'. Сообщение пропустит цикл выполнения и очень важно упомянуть, что цикл цикла никогда не будет выполняться при этом условии, потому что в цикле основного запуска будет много вещей, включая пуск пула автозапуска и выполнение сообщений в очереди, что может повлиять на управление памятью и порядок выполнения код. – tia

+0

Эй, благодарю вас за информацию. Не знал этого! – JustSid

1

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

1

В вашем примере, второе сообщение будет отправлен сразу, а первый добавлен в цикл запуска основного потока, чтобы он не запускался немедленно.

Смежные вопросы