iphone ios在单独的线程中运行
Posted
技术标签:
【中文标题】iphone ios在单独的线程中运行【英文标题】:iphone ios running in separate thread 【发布时间】:2011-04-21 14:50:15 【问题描述】:在单独的线程上运行代码的最佳方式是什么?是吗:
[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];
我一直在做第二种方式,但我一直在阅读的 Wesley Cookbook 使用的是第一种方式。
【问题讨论】:
【参考方案1】:在我看来,最好的方法是使用 libdispatch,又名 Grand Central Dispatch (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 :( 那么操作队列可能是次佳的解决方案。另外,请确保您不会太快地投入到并发中。尝试从编写单线程和配置文件开始,看看你是否需要多线程,或者你是否可以设计你的单线程代码来提高自己的效率。对于简单的任务,您有时可以使用 performSelector:withObject:afterDelay: 完成所需的一切,并避免多线程编程带来的所有问题。 很抱歉这么晚才复活,但是如果我使用 performSelector:withObject:afterDelay 生成方法调用,我还需要在异步方法中使用 NSAutoReleasePool 吗?如果它神奇地使用了主自动释放池,那么 performSElector:afterDelay 绝对是一个更快的选择。 否,因为该方法正在主线程上运行,主线程有自己的自动释放池。 @Joe 冒着说出你已经知道的事情的风险,你不应该养成编写杀死线程的代码的习惯,从长远来看,这对你或你的事业没有帮助。请参阅this post(或许多类似的)了解为什么不杀死线程的原因。【参考方案2】: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
);
);
【讨论】:
【参考方案3】:我会尝试人们发布的所有技术,看看哪种方法最快,但我认为这是最好的方法。
[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
【讨论】:
这会以低优先级启动线程。使用 gcd 是线程的最佳方式。【参考方案4】:我在 NSThread 上添加了一个类别,可以让您轻松地在块中执行线程。您可以从这里复制代码。
https://medium.com/@umairhassanbaig/ios-how-to-perform-a-background-thread-and-main-thread-with-ease-11f5138ba380
【讨论】:
以上是关于iphone ios在单独的线程中运行的主要内容,如果未能解决你的问题,请参考以下文章
ios 7 Push Notification didReceiveRemoteNotification 方法在UI线程或单独线程上运行?
在单独的线程上进行 iPhone CoreLocation 调用的最佳方法?
iPhone:NSFetchedResultsController,具有来自单独线程的委托和数据更新