print - 后台或主线程操作

时间:2018-04-17 05:50:24

标签: ios xcode multithreading logging

这可能听起来非常基本和愚蠢,但它一直困扰着我。 如何根据操作 - 主要或背景对打印进行分类?
作为一个小测试,将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上显示输出,所以它不是后台操作。事实上,所有的伐木作业都不是 如何证明分类的合理性?

1 个答案:

答案 0 :(得分:2)

您认为主线程操作似乎是需要在主线程上执行的调用。从这个角度来看,你是正确的,并且发现这个调用不是主线程操作的证据。

但这与其他事情有什么关系吗?在内部,如果需要,这个方法仍然可以在主线程或任何其他线程上执行其实际操作,以满足我们的需要。所以在这个意义上,主线程操作是一个限制,需要在主线程上执行调用,但与其执行或多线程无关。

在没有查看print在编码方面做了什么的情况下,我们可以看到它适用于多个"计算机"。您可以在插入时在设备(iPhone)上运行应用程序,计算机上的Xcode将打印出日志。这使得怀疑print非常类似于对远程服务器的调用,在这种情况下,服务器负责序列化事件,因此客户端所处的线程没有区别。还有其他一些可能性,例如将日志放入文件然后发送它真的没什么区别。

所以如何根据操作 - 主要或背景对打印进行分类?答案可能是没有。调用不限于任何线程,因此它不是主线程。它可能会锁定它所在的任何线程,直到操作完成,因此它也不是后台。可以把它想象成Data(contentsOf: <#T##URL#>),它将阻止线程,直到检索到给定URL的数据(或抛出异常)。