print操作归属疑问:主线程还是后台线程?
关于print操作的线程归属问题
其实这个问题真的不算基础,不少刚接触多线程开发的朋友都会有类似困惑,我来给你理清楚:
首先明确结论:print 操作本身并没有固定绑定主线程或后台线程,它会在调用它的那个线程上执行。
回到你的测试代码:
Webservice().loadHeadlinesForSource(source: source) { headlines in print("background print") // 这里的print运行在Web服务回调所在的后台线程 self.headlineViewModels = headlines.map(HeadlineViewModel.init) DispatchQueue.main.async { print("main thread print") // 这里的print运行在主线程 completion() } }
你看到两个print都成功输出,本质原因是:
- 第一个print是在Web服务的回调闭包里执行的,这类网络请求的回调通常默认在后台线程(除非服务内部特意切换到主线程),所以它属于后台线程操作;
- 第二个print被放在
DispatchQueue.main.async的闭包里,这个闭包会被系统调度到主线程执行,所以它就属于主线程操作。
额外补充两个关键点:
print是线程安全的API,不管你在哪个线程调用它,都不会出现多线程冲突问题(内部已经做了同步处理);- 要区分UI操作和普通操作:像更新UI这类操作必须在主线程执行,但
print只是向控制台输出文本,不属于UI范畴,所以没有线程限制。
内容的提问来源于stack exchange,提问作者Nitish
相关产品推荐
相关产品推荐

