繁体   English   中英

打印-后台或主线程操作

[英]print - Background or main thread operation

这听起来很基础也很愚蠢,但已经困扰了我一段时间。 如何按操作分类印刷-主印刷或背景印刷?
作为一个小测试,将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在控制台上显示输出,因此它不是后台操作。 实际上,并非所有日志记录操作。
如何证明分类呢?

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

但这和其他东西有关系吗? 在内部,如果需要,此方法仍可以在主线程或我们关心的任何其他线程上执行其实际操作。 因此,从这个意义上说, 主线程操作是一种限制,该调用需要在主线程上执行,但与它的执行或多线程无关。

如果不研究print在编码方面的功能,我们可以看到它可以在多台“计算机”上工作。 您可以在插入设备的同时在设备(iPhone)上运行您的应用,并且计算机上的Xcode将打印出日志。 这令人怀疑print与调用远程服务器很像,在这种情况下,服务器负责序列化事件,因此客户端所处的线程没有区别。 还有其他可能性,例如将日志放入文件然后发送,这实际上没有什么区别。

那么如何根据操作分类打印-主纸还是背景纸呢? 答案可能是没有。 该调用不限于任何线程,因此它不是主要的。 它可能会锁定它所处的线程,直到操作完成为止,因此也不会成为后台线程。 可以将其视为Data(contentsOf: <#T##URL#>) ,它将阻塞线程,直到从给定URL中检索到数据(或引发异常)为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM