我想在新线程上启动一个守护进程,我的程序在等待来自守护进程的输入时没有锁定,但是我需要一种方法让主程序从守护进程中获取信息。我已经使用NSThread来启动一个新线程,但是我没有看到如何使用NSThread的委托。
有关更多上下文,我正在为Quartz Composer开发一个自定义补丁,它将从网络接收数据。这个想法是第二个线程可以运行守护进程,并且在每个帧上,当守护程序线程接收到新数据时,我将从委托方法设置的ivar中获取新数据。所有这些,组合随之一起运行没有中断。
我可以使用NSThread执行此操作吗?我应该看一下更好的方式吗?
答案 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];