1

我对在 iOS 中使用哪个多线程工具来访问服务和根据服务数据更改 UI 感到困惑,

  1. 首先我习惯了使用 NSURLConnection 及其委托,使用 didreceiveresponse、didreceivedata 等委托来完成任务
  2. 其次,我学习并使用 GCD 从块代码中访问服务并更新 UI
  3. 现在我正在学习使用 performSelectorInBackground() 在后台线程中工作

显然对在哪里使用哪个工具感到困惑?

4

3 回答 3

2
  1. NSURLConnection委托调用是从远程服务器接收数据的“老派”方式。此外,在单个类中使用几个 NSURLConnection 实例(UIViewController或其他类)也不是很舒服。现在最好使用sendAsynchronousRequest..带有完成处理程序的方法。您还可以定义完成处理程序将在哪个操作队列(UI 的主队列或其他后台队列)上运行。
  2. GCD 适用于不同的任务,不仅仅是通过initWithContentsOfURL:方法获取远程资源。您还可以控制接收块的队列类型(并发、串行等)
  3. performSelectorInBackground:也是在后台线程中执行方法的“老派”方式。如果您没有使用 ARC,则需要设置单独的自动释放池以避免内存泄漏。它还有一个限制,即不允许给定选择器接受任意数量的参数。在这种情况下,建议使用dispatch_async.

还有NSOperationQueuewithNSOperation及其子类 ( NSInvocationOperation& NSBlockOperation),您可以在其中在后台运行任务以及在主线程上获取有关已完成任务的通知。恕我直言,它们比 GCD 更灵活,您可以创建自己的操作子类并定义它们之间的依赖关系。

于 2012-12-27T17:22:00.890 回答
1

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

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

无论如何,就线程而言,您应该使用哪种工具并不重要。
而是你的目的的问题。如果您不想获取小图像或仅获取少量数据,您可以contentsOfURLperformSelectorInBackground()GDC 调度块或 GDC 调度块中使用。
如果它是关于更多数据和更多信息,如进度或错误处理,你应该坚持使用 *NSURLConnection`。

于 2012-12-27T17:25:01.807 回答
0

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

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

  1. 它非常易于使用,并且由于使用了块,代码仍然非常可读
  2. 它比 NSOperation 之类的级别低,因此当您需要高性能多线程时它要快得多
  3. 它是轻量级且非侵入性的,因此当您想在方法中间添加线程管理时,您的代码不必进行实质性更改。
于 2012-12-27T17:25:34.470 回答