如何在XCode中测试进程在后台线程上运行?

时间:2014-11-12 18:43:49

标签: multithreading afnetworking-2 xcode6.1 background-thread ios8.1

我正在从AFNetworking 1.0升级到AFNetworking 2.0。使用AFNetworking 1.0,我永远无法让它在后台线程上同步,因此当它同步时它会阻止我的UI。

我想在后台线程上运行所有AFNetworking 2.0同步,并在发生同步时更新UI但不会停止UI。

如果AFNetworking在后台线程上运行,我如何在XCode中测试?有没有可视方法来测试哪些进程在哪些线程上运行?

2 个答案:

答案 0 :(得分:1)

首先:进程是包含多个线程的进程,因此进程永远不能在后台线程上运行,因为它是包含所有线程的进程。

现在你的线程之间的通信问题: AFNetworking位于NSOperationNSOperationQueue之上。每个请求都是在操作队列中运行的操作。这意味着无论您在何处启动它,每个请求始终都在后台队列上运行。但是,您可以指定调用成功和失败完成处理程序的队列。如果未指定队列,则始终在主队列中调用完成块。

因此,默认情况下,您的操作/连接将在后台处理,以防止UI被阻止。但是,您的完成处理程序在主线程上调用,以便您可以从那里更新UI。如果您使用此默认行为但您的UI仍处于阻止状态,则可能会在完成处理程序中执行大量工作。在这种情况下,您应该为完成处理程序设置专用队列。您可以在-[AFURLConnectionOperation setCompletionQueue:]的每个操作中执行此操作。

请注意,如果您这样做,则需要将所有UIKit相关的调用分派到主队列。

附注:后台队列并不一定意味着它在后台线程中运行。队列在大型中央调度中实现,其中线程的概念不存在。但是,一般来说,gcd队列的概念与线程非常相似,但您应该尝试不在应用程序的单个部分中混合和匹配这两个概念,或者认为可能会变得复杂且难以调试。

答案 1 :(得分:0)

暂停程序执行时,可以在调试导航器中查看所有线程。您可以在iOS Developer Library

中找到有关它的详细信息

debug navigator