众所周知,Combine要解决的问题就是数据如何异步流动,这就不可避免的要讨论到线程和调度的问题,数据的处理在哪个线程? 又在哪个线程流出?
receive
大家仔细观察上图可发现,receive
能够改变其下游数据的接收线程,注意,它影响的是下游。
这在某些场景下是非常有用的,比如,当我们发起网络请求的时候,我们希望它是在子线程调用的,当数据回来后,我们希望在主线程来刷新UI。
举个例子:
cancellable = publisher
.sink(receiveCompletion: {
DispatchQueue.main.async {
/// 刷新UI
}
}, receiveValue: {
print($0)
})
复制代码
cancellable = publisher
.receive(on: RunLoop.main)
.sink(receiveCompletion: {
/// 刷新UI
}, receiveValue: {
print($0)
})
复制代码
由上边代码的对比可知,当使用receive
切换线程后,下游的数据和处理就都切换到了receive
指定的线程。
subscribe
观察上图可知,subscribe
跟receive
刚好相反,它影响的是pipline上游调用的线程。由于subscribe
在真实开发中用到的并不多,我们就不做详细解释了,
let publisher = PassthroughSubject<Int, Error>()
let myBgQueue = DispatchQueue(label: "myBgQueue")
cancellable = publisher
.subscribe(on: myBgQueue)
.receive(on: RunLoop.main)
.sink(receiveCompletion: {
print($0)
/// 刷新UI
}, receiveValue: {
print($0)
})
publisher.send(1)
复制代码