Multithreading 调用performSelectorInBackground:从后台线程

Multithreading 调用performSelectorInBackground:从后台线程,multithreading,cocoa-touch,cocoa,grand-central-dispatch,Multithreading,Cocoa Touch,Cocoa,Grand Central Dispatch,从后台运行的方法调用performSelectorInBackground:…的真正效果是什么?我希望它异步运行 例如: - (void) _imageBufferWasUpdated{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //do something here if(shouldContinue){ [self performSelectorInBackground

从后台运行的方法调用performSelectorInBackground:…的真正效果是什么?我希望它异步运行

例如:

- (void) _imageBufferWasUpdated{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //do something here

    if(shouldContinue){ 
        [self performSelectorInBackground:@selector(_loop) withObject:nil];
    }
    [pool release];
}
_imageBufferWasUpdated将在后台运行,我想异步调用_循环方法(在后台,imageBufferWasUpdated也将很快完成,可能在_循环结束之前)

这是正确的吗

使用GCD是否有更有效(且相对简单)的方法?如果您能给出一些关于如何使用GCD进行分叉的示例,我将不胜感激。我想我至少需要3个线程,主线程,运行_imageBufferWasUpdated的后台线程和其他_循环的后台线程。我说得对吗

提前谢谢
Ignacio执行SelectorInBackground将选择器分叉到后台线程。[]

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


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

我觉得您所做的很好。Cocoa可能只使用一个后台线程,因此不应导致创建过多线程

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

#import <dispatch/dispatch.h>

...

dispatch_async( dispatch_get_global_queue(0,0), ^{
    [self _loop];
}];
#导入
...
调度异步(调度获取全局队列(0,0)^{
[自我循环];
}];

请有人帮帮我!;)后台线程中的进程非常慢,我不知道这是否是原因…它不能使用单个后台线程;这样做会很快导致死锁。我认为这并不是我想要的,因为使用dispatch\u get\u global\u queue将使_循环在主线程中运行,而该循环忙于其他事情。它不是类似于performSelectorOnMainThread:。。。而不是performSelectorOnBackgroundThread?默认全局队列不会在主线程上运行。您要求主队列执行此操作。默认队列在后台线程上运行。谢谢;)那我就试试。谢谢杰里米,我会试试GCD;)