我正在从 AFNetworking 1.0 升级到 AFNetworking 2.0。使用 AFNetworking 1.0,我永远无法让它在后台线程上同步,所以当它同步时它会停止我的 UI。
我想在后台线程上运行所有 AFNetworking 2.0 同步,并在同步发生时更新 UI,但不停止 UI。
如果 AFNetworking 在后台线程上运行,我如何在 XCode 中进行测试?是否有一种可视化的方法来测试哪些进程在哪些线程上运行?
我正在从 AFNetworking 1.0 升级到 AFNetworking 2.0。使用 AFNetworking 1.0,我永远无法让它在后台线程上同步,所以当它同步时它会停止我的 UI。
我想在后台线程上运行所有 AFNetworking 2.0 同步,并在同步发生时更新 UI,但不停止 UI。
如果 AFNetworking 在后台线程上运行,我如何在 XCode 中进行测试?是否有一种可视化的方法来测试哪些进程在哪些线程上运行?
第一:进程是包含多个线程的进程,因此进程永远不能在后台线程上运行,因为它是包含所有线程的进程。
现在解决线程之间通信的问题:
建立在andAFNetworking
之上。每个请求都是在操作队列中运行的操作。这意味着每个请求始终在后台队列上运行,无论您从哪里开始。但是,您可以指定调用成功和失败完成处理程序的队列。如果您未指定队列,则始终在主队列中调用完成块。NSOperation
NSOperationQueue
因此,默认情况下,您的操作/连接在后台处理,以防止您的 UI 阻塞。但是,您的完成处理程序在主线程上调用,以便您能够从那里更新您的 UI。如果您使用此默认行为但您的 UI 仍处于阻塞状态,您可能会在完成处理程序中做很多工作。在这种情况下,您应该为完成处理程序设置一个专用队列。您可以在每个操作中使用-[AFURLConnectionOperation setCompletionQueue:]
.
请记住,UIKit
如果这样做,您需要将所有相关调用分派到主队列。
附注:后台队列并不一定意味着它在后台线程中运行。队列在不存在线程概念的大型中央调度中实现。但是,一般来说,gcd 队列的概念与线程非常相似,但是您应该尽量不要在应用程序的单个部分中混合和匹配这两个概念,否则可能会变得复杂且难以调试。
当您暂停程序执行时,您可以在调试导航器中看到所有线程。您可以在iOS Developer Library中找到有关它的详细信息。