异步运行NSThread,但是有一个委托?

时间:2011-11-15 03:32:38

标签: objective-c delegates nsthread quartz-composer

我想在新线程上启动一个守护进程,我的程序在等待来自守护进程的输入时没有锁定,但是我需要一种方法让主程序从守护进程中获取信息。我已经使用NSThread来启动一个新线程,但是我没有看到如何使用NSThread的委托。

有关更多上下文,我正在为Quartz Composer开发一个自定义补丁,它将从网络接收数据。这个想法是第二个线程可以运行守护进程,并且在每个帧上,当守护程序线程接收到新数据时,我将从委托方法设置的ivar中获取新数据。所有这些,组合随之一起运行没有中断。

我可以使用NSThread执行此操作吗?我应该看一下更好的方式吗?

2 个答案:

答案 0 :(得分:2)

您可能还需要考虑使用操作队列(NSOperation)或调度队列(GCD)而不是NSThread。

如果您还没有,请查看Apple的Concurrency Programming Guide;他们真的推荐基于队列的方法,而不是显式的线程创建。

答案 1 :(得分:1)

编辑:如果您希望在主线程上发生委托回调,请使用以下模式: [委托performSelectorOnMainThread:@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