![](/img/trans.png)
[英]Not receiving inputs when using `.receive(on: DispatchQueue.main)`
[英]Behavior for receive(on:) for DispatchQueue.main
給定以下來自類的代碼:
cancellable = input
.receive(on: scheduler)
.map { ... }
.sink(receiveValue: { value in
self.state = value
})
其中input
是 PassthroughSubject。
現在,當scheduler
是主隊列或 RunLoop.main AND 輸入將從主線程調用時, receive(on: scheduler)
編程方式優化顯式調度到主隊列?
所以,基本上是這樣的:
if Thread.isMainThread {
/* execute closure */
} else {
/* dispatch closure async to main */
}
receive(on:)
的文檔給出了一個模糊的提示,它可能會執行一些優化:
“與顯式使用調度隊列相比,更喜歡接收(on:options:)”
pub.sink {
DispatchQueue.main.async {
// Do something.
}
}
不, receive(on:)
不會優化調度。 這樣做可能會導致僵局。 例子:
let l = Lock()
let cancellable = input
.receive(on: scheduler)
.map { ... }
.sink(receiveValue: { value in
l.lock()
self.state = value
l.unlock()
})
l.lock()
input.send(1)
l.unlock()
如果調度被消除,這個例子將嘗試鎖定已經鎖定的鎖l
,並掛起(如果可以檢測到死鎖,則崩潰)。
查看RunLoop和DispatchQueue的來源, 看起來它們與調度Scheduler
協議的一致性沒有這樣的優化。
但公平地說,可能會有較低級別的優化在起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.