iPhone ios在单独的线程中运行


96

在单独的线程上运行代码的最佳方法是什么?是吗:

[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];

要么:

    NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(doStuff:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];

我一直在做第二种方式,但我一直在阅读的《韦斯利食谱》使用的是第一种方式。

Answers:


243

在我看来,最好的方法是使用libdispatch,也称为大中央调度(GCD)。它限制您使用iOS 4及更高版本,但它是如此简单易用。在后台线程上进行一些处理,然后在主运行循环中对结果进行处理的代码非常简单和紧凑:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    //
    //
    dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
    });
});

如果尚未执行此操作,请查看WWDC 2010上libdispatch / GCD / blocks上的视频。


我需要与3.0兼容:(
Mike S

1
然后,操作队列可能是第二好的解决方案。另外,请确保您没有太快地进入并发。尝试从编写单线程和概要文件开始,以查看是否需要使用多线程,或者是否可以设计单线程代码以提高效率。对于简单的任务,有时可以使用performSelector:withObject:afterDelay:来完成所需的一切,并避免多线程编程所带来的所有问题。
雅克2010年

很抱歉在以后重新启用它,但是如果我使用performSelector:withObject:afterDelay生成方法调用,我是否仍需要在async方法内使用NSAutoReleasePool?如果它神奇地使用了主自动释放池,那么performSElector:afterDelay无疑是一个更快的选择。
迈克S

否,因为该方法是在具有自己的自动释放池的主线程上运行的。
雅克

4
@Joe冒着说早已知道的事情的风险,您不应该养成编写会杀死线程的代码的习惯,从长远来看,这不会对您或您的职业有所帮助。请参阅这篇文章(或许多喜欢的文章),以了解为什么不杀死线程的原因。
MikeC 2012年

1

在iOS中进行多线程处理的最佳方法是使用GCD(Grand Central Dispatch)。

//creates a queue.

dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);

dispatch_async(myQueue, ^{
    //stuffs to do in background thread
    dispatch_async(dispatch_get_main_queue(), ^{
    //stuffs to do in foreground thread, mostly UI updates
    });
});

0

我会尝试人们发布的所有技术,然后看看哪一种是最快的,但是我认为这是最好的方法。

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];

这会以低优先级启动线程。使用gcd是最好的线程化方法。
卡斯滕

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.