这可能听起来非常基本和愚蠢,但它一直困扰着我。 如何根据操作 - 主要或背景对打印进行分类?
作为一个小测试,将print
放入后台任务 - Web服务调用:
Webservice().loadHeadlinesForSource(source: source) { headlines in
print("background print")
self.headlineViewModels = headlines.map(HeadlineViewModel.init)
DispatchQueue.main.async {
print("main thread print")
completion()
}
}
两个打印报表都打印出来。根据以前的经验,如果print是一个主线程任务,Xcode会给我一个警告,说我需要把它放在主线程中。 这是打印不是主线程操作的证据。 注意我不是说打印是后台任务。
但是,我有这样的理解,因为print
在Console上显示输出,所以它不是后台操作。事实上,所有的伐木作业都不是
如何证明分类的合理性?
答案 0 :(得分:2)
您认为主线程操作似乎是需要在主线程上执行的调用。从这个角度来看,你是正确的,并且发现这个调用不是主线程操作的证据。
但这与其他事情有什么关系吗?在内部,如果需要,这个方法仍然可以在主线程或任何其他线程上执行其实际操作,以满足我们的需要。所以在这个意义上,主线程操作是一个限制,需要在主线程上执行调用,但与其执行或多线程无关。
在没有查看print
在编码方面做了什么的情况下,我们可以看到它适用于多个"计算机"。您可以在插入时在设备(iPhone)上运行应用程序,计算机上的Xcode将打印出日志。这使得怀疑print
非常类似于对远程服务器的调用,在这种情况下,服务器负责序列化事件,因此客户端所处的线程没有区别。还有其他一些可能性,例如将日志放入文件然后发送它真的没什么区别。
所以如何根据操作 - 主要或背景对打印进行分类?答案可能是没有。调用不限于任何线程,因此它不是主线程。它可能会锁定它所在的任何线程,直到操作完成,因此它也不是后台。可以把它想象成Data(contentsOf: <#T##URL#>)
,它将阻止线程,直到检索到给定URL的数据(或抛出异常)。