从后台运行的方法调用performSelectorInBackground:...
的真正效果是什么?我希望它以异步方式运行
例如:
- (void) _imageBufferWasUpdated{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//do something here
if(shouldContinue){
[self performSelectorInBackground:@selector(_loop) withObject:nil];
}
[pool release];
}
_imageBufferWasUpdated将在后台运行,我想异步调用_loop方法(在后台也是如此_imageBufferWasUpdated很快就会完成,可能在_loop结束之前)。
这是对的吗?
使用GCD有更高效(且相对简单)的方法吗?如果你能举一些关于如何使用GCD进行分叉的例子,我将不胜感激。我想我需要至少3个线程,主线程,运行_imageBufferWasUpdated的后台线程和_loop的其他后台线程。我是对的吗?
提前致谢 伊格纳西奥
答案 0 :(得分:2)
你在做什么对我来说似乎很好。 Cocoa可能使用单个后台线程,因此不应该导致过多的线程创建。
如果您想要更多控制,可以使用NSOperation或GCD。两者都很简单。例如,GCD就像这样
#import <dispatch/dispatch.h>
...
dispatch_async( dispatch_get_global_queue(0,0), ^{
[self _loop];
}];
答案 1 :(得分:1)
performSelectorInBackground将您的选择器分叉到后台线程。 [documentation]
我不知道我是否正确,但你应该使用GCD或其高级别课程(NSOperationQueue)来做所有事情。如果系统饱和了太多线程并且没有足够的计算资源,那么分叉太多后台线程可能会导致性能下降
GCD根据可用的系统资源自动管理并发操作的线程数。