簡體   English   中英

DispatchQueue.main 的 receive(on:) 行為

[英]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 ,並掛起(如果可以檢測到死鎖,則崩潰)。

查看RunLoopDispatchQueue的來源, 看起來它們調度Scheduler協議的一致性沒有這樣的優化。

但公平地說,可能會有較低級別的優化在起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM