iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 7

30 天了解 Swift 的 Combine: [07] 被封裝的 Subscriber

  • 分享至 

  • xImage
  •  

如果你沒有要自製 Subscriber 的需求, 其實 Combine 已經完整的封裝了, 不需要額外理解特殊的處理.

以下翻譯自 Combine documentation protocol Subscriber

Combine 提供 Publisher 具備 Subscribers 的 Operator: `sink()` 與 `assign(to:on:)`

1. sink(receiveCompletion:receiveValue:) 會在 Subscriber 接收到 新的事件與事件終止時, 分別執行 相對應的閉包.

2. assign(to:on:) 會直接將事件值寫入一個 Referance type 的屬性, 透過 keypath 的方式, 直接綁定了事件.

要特別注意的是, 以上這兩個都必須在 Failure 是 Never 的時候, 才可以使用. 使用assign(to:on:)可以直接避免 retain cycle.

Cancellable

雖然 Subscriber 感覺好像是 必須相依與 Publisher 的, 但是事實上是 Publisher 將事件源頭確立之後, 提供了一個建立 Subscriber 的工廠接口, 而這些接口都會回傳一個 AnyCancellable 的參考型別, 依照 AnyCancellable 文件, 其代表的是 cancellation token 作為取消事件流的途徑, 而由於 ARC 的記憶體管理, 這個 Token 若是沒有保持 ARC 的計數時, 將會在 function Scope 結束後自動解除訂閱.

因此, 在 AnyCancellable 只有 3 個 API 可以使用:

AnyCancellable.cancel()
AnyCancellable.store<C>(in: inout C) where C : RangeReplaceableCollection, C.Element == AnyCancellable
AnyCancellable.store(in: inout Set<AnyCancellable>)

簡單測驗:

  1. 使用AnyCancellable.cancel()後, 非同步會立即中斷嗎? (例如刪除指令)
  2. 建立一個沒有泛型的 IntNeverSubscriber 類別

whoami:
我是游諭, ytyubox


上一篇
30 天了解 Swift 的 Combine: [06] More Publisher, Just, Future, Promise
下一篇
30 天了解 Swift 的 Combine: [08] Publisher 延展類:Subject
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ytyubox
iT邦新手 5 級 ‧ 2020-09-29 12:05:55

修正: assign 有 retain cycle

我要留言

立即登入留言