调用performSelectorInBackground:从后台线程

时间:2010-12-12 16:11:55

标签: multithreading cocoa-touch cocoa grand-central-dispatch

从后台运行的方法调用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的其他后台线程。我是对的吗?

提前致谢 伊格纳西奥

2 个答案:

答案 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根据可用的系统资源自动管理并发操作的线程数。