在iOS中选择适当的多线程技术

时间:2012-12-27 17:13:26

标签: ios ios6 nsurlconnection grand-central-dispatch performselector

我很困惑在iOS中使用哪种多线程工具来点击服务和根据服务数据更改UI,

  1. 首先我习惯使用NSURLConnection及其代表,使用didreceiveresponse,didreceivedata等代理来完成任务
  2. 其次,我学习并使用GCD来命中服务并从块代码中更新UI
  3. 现在我正在学习使用performSelectorInBackground()在后台线程中完成工作
  4. 显然对哪个工具使用位置感到困惑?

3 个答案:

答案 0 :(得分:2)

    带有委托呼叫的
  1. NSURLConnection是从远程服务器接收数据的“老派”方式。在单个类中使用少量NSURLConnection实例(UIViewController或不可用)并不是很舒服。现在最好将sendAsynchronousRequest..方法与完成处理程序一起使用。您还可以定义将运行完成处理程序的操作队列(主要用于UI或其他操作队列)。
  2. GCD适用于不同的任务,而不仅仅是使用initWithContentsOfURL:方法获取远程资源。您还可以控制哪些类型的队列将接收您的块(并发,串行等)
  3. performSelectorInBackground:也是在后台线程中执行方法的“老派”方式。如果您不使用ARC,则需要设置单独的自动释放池以避免内存泄漏。它还具有不允许向给定选择器接受任意数量的参数的限制。在这种情况下,建议使用dispatch_async
  4. 还有NSOperationQueue NSOperation及其子类(NSInvocationOperation& NSBlockOperation),您可以在后台运行任务以及获取主要通知完成任务的线程。恕我直言他们比GCD更灵活,你可以创建自己的操作子类,并定义它们之间的依赖关系。

答案 1 :(得分:1)

最重要的是,除了主线程之外,你永远不会在另一个线程中更改UI。

我认为,您提到的所有要点在后台使用相同的技术: GDC 。但我不确定。

无论如何,在线程方面你应该使用哪种工具无关紧要 这是你的目的的问题。如果您不想获取小图片或仅提取少量数据,则可以在contentsOfURL或GDC调度块中使用performSelectorInBackground()。 如果它是关于更多数据和更多信息,如进度或错误处理,你应该坚持使用* NSURLConnection`。

答案 2 :(得分:0)

我建议在所有情况下使用GCD。其他技术仍然存在,但主要是为了向后兼容。

GCD最好有3个原因(至少):

  1. 使用非常简单,并且由于使用了块,代码仍然非常易读
  2. 它比NSOperation更低级别,因此当您需要高性能多线程时更快
  3. 它是轻量级的,并且非侵入式,因此当您想要在方法中间添加线程管理时,您的代码不必大幅改变。