iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 16

30 天了解 Swift 的 Combine: [16] Operator 之後,開始 assign

  • 分享至 

  • xImage
  •  

連續的介紹 Operator 之後,會發現很多範例都有 sink, 如果沒有調用這個, Publisher 將不會執行.

今天要特別講 sinkassign 這兩個 Operator

sink: 針對收到元素與結束通知時, 分別執行指定的指令

var set = Set<Anycancellable>()
let pst = PassthroughSubject<String,Error>()

pst.sink(receiveCompletion: { result in // 1
    switch result {  // 2 
    case .finished:   
        break
    case .failure(let e):
        print(e)
    }
}, receiveValue: {print($0)})
.store(in: &set)
pst.send("123")

在這個例子中, 我們完成了一個簡單的 Combine 運作.

  1. 我們使用 sink, 取得分別可以應對收到結束與收到元素的執行閉包設定方式, 在這裡我習慣把這件事稱為 執行綁定.
  2. 透過 recevieCompletion 的設定, 我們可以用 Promise 的方式, 注入對應成功或失敗的方式.

Sink 有機會造成 Retain cycle.

assign: 將元素直接付與到 Object 的屬性.

沒錯, 只能是 Object, 不能是 Struct/enum, 也不能是 static

class OBJECT {
    static let shared = OBJECT()
    private init() {}
    var str:String = ""
}

var set = Set<Anycancellable>()
let pst = PassthroughSubject<String,Never>()

pst..assign(to: \.str, on: OBJECT.shared)
.store(in: &set)
pst.send("123")

而且 Failure 只能是 Never.

簡單測驗
參考以下範例, 是否存在 retain cycle?

class DEMOVC:UIViewController {
    var time:Date = Date()
    var set = Set<AnyCancellable>()
    override func viewDidLoad() {
        super.viewDidLoad()
        Timer.publish(every: 1, on: .main, in: .common)
        .autoconnect()
        .assign(\.time, self)
        .store(in: &set)
    }
}

上一篇
30 天了解 Swift 的 Combine: [15] Operator 10. 時間控制類型
下一篇
30 天了解 Swift 的 Combine: [17] 進入 UIKit 之前, 介紹 @Published
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言