Combine之Operator(Scheduler and Thread handling 处理线程)

·  阅读 1192

github.com/agelessman/…

众所周知,Combine要解决的问题就是数据如何异步流动,这就不可避免的要讨论到线程和调度的问题,数据的处理在哪个线程? 又在哪个线程流出?

receive

image.png

大家仔细观察上图可发现,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

image.png

观察上图可知,subscribereceive刚好相反,它影响的是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)
复制代码
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改