Ios 打印-后台或主线程操作

Ios 打印-后台或主线程操作,ios,xcode,multithreading,logging,Ios,Xcode,Multithreading,Logging,这听起来可能很简单和愚蠢,但它一直困扰着我一段时间。印刷品如何按操作分类?主要还是背景? 作为一个小测试,将print放入后台任务-web服务调用时: Webservice().loadHeadlinesForSource(source: source) { headlines in print("background print") self.headlineViewModels = headlines.map(HeadlineViewModel

这听起来可能很简单和愚蠢,但它一直困扰着我一段时间。印刷品如何按操作分类?主要还是背景?
作为一个小测试,将
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
在编码方面的作用,我们可以看到它可以跨多台“计算机”工作。您可以在设备(iPhone)上运行应用程序,同时插入电源,计算机上的Xcode将打印日志。这让人怀疑,
print
很像对远程服务器的调用,在这种情况下,服务器负责序列化事件,因此客户端在哪个线程上没有区别。还有其他的可能性,比如将日志放到文件中,然后发送,这实际上没有什么区别


那么,印刷品是如何按照主要操作还是背景进行分类的呢?答案可能是没有。调用不限于任何线程,因此它不是主线程。它可能会锁定它所在的任何线程,直到操作完成,因此它也不是后台线程。想想它,如<代码>数据(CordsOs:):/>代码,它会阻塞线程直到检索到来自给定URL的数据(或异常被抛出)。

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

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

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

那么,印刷品是如何按照主要操作还是背景进行分类的呢?答案可能是没有。调用不限于任何线程,因此它不是主线程。它可能会锁定它所在的任何线程,直到操作完成,因此它也不是后台线程。把它想象成
数据(contentsOf:)
,它将阻塞线程,直到从给定URL检索到数据(或引发异常)