iPhone编程:如何在后台执行代码?

时间:2014-03-25 10:42:17

标签: iphone objective-c

我们如何编写代码以在iPhone应用程序中在后台运行,与Android中的ServiceAsyncTask相同?

1 个答案:

答案 0 :(得分:5)

iOS平台,因为iOS 3.0完全支持多线程和后台代码执行。有几种方法可以实现这一点(线程不是主UI线程我称之为后台线程)。我将尝试涵盖所有:

  1. NSThread - 当您想要完全控制背景线程时,您应该使用它。您可以使用setThreadPriority:控制线程优先级,设置线程堆栈大小,名称等。NSThread只是pthreads周围的Cocoa包装器,您也可以使用它,但它是一种旧方式我甚至不会考虑它。例如,有关如何使用pthreads的指南或NSThread请查看此处:https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

  2. - (void)performSelectorInBackground :最简单的方法之一。它只是在新的后台线程上运行指定的方法:简单而坚固。对于文档,请查看此处:https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/reference.html#//apple_ref/occ/instm/NSObject/performSelectorInBackground:withObject

     [self performSelectorInBackground:@selector(makeNetworkRequestOrWhateverInBackground:)
                   withObject:someArgument];
    

    NSThread方式相同[NSThread detachNewThreadSelector:@selector(makeNetworkRequestOrWhateverInBackground:) toTarget:self withObject:nil];

    但是我想强调它现在是not做背景事情的好方法。 performSelector有很多缺点:它很慢(动态创建NSThread对象,内存开销,因为存储线程堆栈,等等),将数据传递给方法,你想要的保持在后台是一个真正痛苦的屁股(你必须将它包装在withObject参数中,或在你的对象中使全局数据和全局数据是一件坏事)。 Apple还建议使用GCD代替线程,因此使用performSelectorInBackground,例如here。所以第三个选项就是你真正需要的。

  3. GCD - 盛大的中央调度 - 现在是主流技术。许多不同的第三方库使用AFNetworking(因此构建在AFNetworking之上的库,例如RestKit)。我想你会经常使用这种多线程方法。如果您只想并行化一些简单的任务,异步进行一些网络调用,从Core Data获取数据等,您应该使用GCD。当与Objective-C blocks结合使用时,这项技术非常漂亮(并且设计用于它们),但您不仅可以使用块,还可以使用具有f-variants GCD功能的常规函数​​。许多漂亮的Objective-C框架都建立在顶级GCD之上。简单的使用示例:

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       [self makeNetworkRequestOrWhateverInBackground];
    });
    
  4. NSOperationQueue是简单线程的更高抽象级别。 NSOperationQueue对象是一个队列,它处理NSOperation类类型的对象,它代表一个任务,包括数据和与任务相关的代码。它将线程概念抽象为操作概念。您可以创建子类,创建复杂的操作依赖图,取消等等。它支持许多其他更高级别的语义和概念。另请参阅Bolts框架 - 一个非常有趣的实现和Parse和Facebook所有这些东西的包装器。 NSOperation概念IMO是一种处理基于任务的并行性的Apple方法,这意味着您可以根据"任务和#34;来设计算法。 (工作要做)而不是线程和核心的细节。有关NSOperationNSOperationQueue的理论和示例,请查找好的教程herehere