3

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 的其他后台线程。我对么?

提前感谢伊格纳西奥

4

2 回答 2

2

你在做什么对我来说似乎很好。Cocoa 可能使用单个后台线程,因此它不应该导致过多的线程创建。

如果你想要更多的控制,你可以使用 NSOperation 或 GCD。两者都很简单。例如,GCD 会是这样的

#import <dispatch/dispatch.h>

...

dispatch_async( dispatch_get_global_queue(0,0), ^{
    [self _loop];
}];
于 2010-12-12T18:43:52.903 回答
1

performSelectorInBackground 将您的选择器分叉到后台线程。[文档]

我不知道我是否正确,但您应该使用 GCD 或其高级类 (NSOperationQueue) 来做所有事情。如果系统线程过多且计算资源不足,则分叉过多的后台线程可能会导致性能下降

GCD 根据可用的系统资源自动管理并发操作的线程数。

于 2010-12-12T17:46:40.667 回答