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

Multithreading 如何在XCode中测试进程是否在后台线程上运行?,multithreading,afnetworking-2,xcode6.1,background-thread,ios8.1,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中进行测试?是否有一种直观的方法来测试哪些进程在哪些线程上运行?首先:进程是包含多个线程的进程,因此进程永远不能在后台线程上运行,因为它是包含所有线程的进程 现

我正在从AFNetworking 1.0升级到AFNetworking 2.0。在AFNetworking 1.0中,我无法让它在后台线程上同步,因此它在同步时会暂停我的UI

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


如果AFNetworking正在后台线程上运行,如何在XCode中进行测试?是否有一种直观的方法来测试哪些进程在哪些线程上运行?

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

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

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

请记住,如果这样做,您需要将所有
UIKit
相关调用分派到主队列


旁注:后台队列并不一定意味着它正在后台线程中运行。队列在grand central dispatch中实现,其中不存在线程的概念。但是,一般来说,gcd队列的概念与线程非常相似,但是您应该尽量避免在应用程序的单个部分中混合和匹配这两个概念,否则可能会变得复杂且难以调试。

当您暂停程序执行时,您可以在调试导航器中看到所有线程。您可以在中找到有关它的详细信息


在一个具有UI进程和应在后台发生的进程的示例中,即UI进程永远不应被后台进程停止(导致屏幕滚动不连贯),在Xcode中是否有一种方法可以直观地看到与web服务的后台同步可能发生在哪个进程上?您可以在工具中可视化各种想法,Xcode附带的分析工具。然而,同样,这个过程始终是你的应用程序,据我所知,只要你依赖gcd,线程并不总是相同的,这是你在使用
AFNetworking
时所做的。