2010-09-16 4 views
0

Хотя я обычно использую NSOperation для того, чтобы поток выполнял короткую задачу/операцию, я хотел бы иметь длинный живой выделенный поток, который всегда доступен для обработки определенных операций. Для этого я выделяю новый NSThread и использовать метод initWithTarget:Правильный способ запуска/продолжения runloop

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument 

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

ли какое-то время цикла, как это уместно ...

(void)newThreadMainMethod { 
    while(1) { 
     [[NSThread currentThread] run]; 
    } 
} 

или есть более эффективный способ сделать это так, чтобы нить не занимает ресурсы с бесконечной петли? Я думал о том, чтобы таймер просыпался каждые 0,5 секунды и вызывал бег по потоку в случае, если что-то новое доступно для работы. Буду признателен за ваш вклад.

Спасибо.

+0

Я бы определенно профайл, чтобы убедиться, что это на самом деле быстрее, чем NSOperation, потому что кажется, что NSOperationQueue уже делает то, о чем вы говорите. – Chuck

ответ

2

[[NSRunLoop currentRunLoop] run] - это то, что вы хотите, но оно будет продолжаться вечно, поэтому вам нужно только позвонить его один раз (не в цикле). Вы можете:

  • сделать это, прекращение нити внутри цикла выполнения, когда/при необходимости
  • использование [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: JIFFY_TIME] и опрос для состояния выхода в while() петли, как вы написали.
+0

Мой опыт в том, что вызов вызова приведет к тому, что NSThread завершится, если ничто еще не было помещено в поток. Единственный способ сохранить его в живых, поставив цикл while на выполнение с условием? – Paul

+0

Если вам нужно, чтобы он оставался, добавьте источник. – 2010-09-16 21:56:53

+0

Я читал об источниках ... Можете ли вы привести пример, как добавить источник? – Paul

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