Держать ссылку на NSThread вокруг и сообщать его объекты? - PullRequest
1 голос
/ 27 апреля 2010

Я немного не уверен, как это сделать:

Я запускаю «рабочий поток», который работает на протяжении всей жизни приложений.

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

тогда

- (void) updateModel {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    BackgroundUpdate *update = [[BackgroundUpdate alloc] initWithTimerInterval:5];
    [[NSRunLoop currentRunLoop] run];   //keeps it going 'forever'
    [update release];
    [pool release];
}

Теперь поток «просыпается» каждые 5 секунд (initWithTimerInterval), чтобы увидеть, Есть любые задачи, которые он может выполнить. Все задачи в классе BackGroundUpdate пока зависят только от времени. Я хотел бы иметь несколько, которые были "зависимыми от события". например Я хотел бы вызвать фоновый объект из моего основного потока и указать ему «speedUp», «slowDown», «reset» или любой другой метод объекта.

Чтобы сделать это, я думаю, мне нужно что-то вроде performSelectorOnThread, но как получить ссылку на NSthread и фоновый объект?

1 Ответ

3 голосов
/ 24 июня 2010

Прямой ответ: Вместо + [NSThread detachNewThreadSelector: toTarget: withObject:] используйте [[NSThread alloc] initWithTarget: selector: object:]. Не забудьте позвонить -start!

Другие мысли:

  • Попробуйте вместо этого использовать NSOperation / NSOperationQueue. Проще и эффективнее для большинства рабочих потоков.
  • Подумайте, действительно ли вам нужно выполнять эту периодическую проверку в фоновом потоке. Не могли бы вы просто сделать это в главном цикле выполнения, а затем при необходимости перебросить работу на другие потоки? Темы не бесплатны.
  • Подумайте, является ли опрос лучшей реализацией. Изучите NSCondition и / или NSConditionLock для более эффективных способов пробуждения потоков, когда что-то происходит (например, добавление работы в очередь), без опроса.
...