Асинхронно запустить NSThread, но с делегатом? - PullRequest
0 голосов
/ 15 ноября 2011

Я хочу запустить демон в новом потоке, чтобы моя программа не блокировалась при ожидании ввода от демона, но мне нужен способ, чтобы основная программа могла получить информацию от демона.Я использовал NSThread для запуска нового потока, но я не вижу, как использовать делегат с NSThread.

Для большего контекста я работаю над пользовательским патчем для Quartz Composer, который будет получатьданные из сети.Идея состоит в том, что второй поток мог бы запустить демон, и в каждом кадре я бы брал новые данные из ивара, установленного методом делегата, когда поток демона получал новые данные ... все это время композиция работает вместе сбез перерыва.

Могу ли я сделать это с помощью NSThread?Есть ли лучший способ, на который я должен смотреть?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Вы также можете рассмотреть возможность использования очередей операций (NSOperation) или очередей отправки (GCD) вместо NSThread.

Если вы еще этого не сделали, посмотрите на Руководство по программированию параллелизма Apple ;они действительно рекомендуют подход на основе очереди вместо явного создания потока.

1 голос
/ 15 ноября 2011

Редактировать: Если вы хотите, чтобы обратные вызовы делегата происходили в основном потоке, используйте этот шаблон: [делегат executeSelectorOnMainThread: @selector (threadDidSomething :) withObject: self waitUntilDone: NO]

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

@protocol ThreadLogicContainerDelegate <NSObject>
- (void)threadLogicContainerDidStart:(ThreadLogicContainer*)theThreadLogicContainer;
- (void)threadLogicContainerDidFinish:(ThreadLogicContainer*)theThreadLogicContainer;
@end

@interface ThreadLogicContainer

- (void)doWorkWithDelegate:(id<ThreadLogicContainerDelegate>)delegate;

@end

@implementation ThreadLogicContainer

- (void)doWorkWithDelegate:(id<ThreadLogicContainerDelegate>)delegate
{
    @autoreleasepool
    {
        [delegate threadLogicContainerDidStart:self];

        // do work

        [delegate threadLogicContainerDidFinish:self];
    }
}

@end


@interface MyDelegate <ThreadLogicContainerDelegate>
@end

@implementation MyDelegate
- (void)threadLogicContainerDidStart:(ThreadLogicContainer*)theThreadLogicContainer
{}
- (void)threadLogicContainerDidFinish:(ThreadLogicContainer*)theThreadLogicContainer
{}
@end

Пример использования:

ThreadLogicContainer* threadLogicContainer = [ThreadLogicContainer new];
[NSThread detachNewThreadSelector:@selector(doWorkWithDelegate:)
                         toTarget:threadLogicContainer
                        withObject:myDelegate];

ссылка: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html

...