連續的介紹 Operator 之後,會發現很多範例都有 sink
, 如果沒有調用這個, Publisher 將不會執行.
今天要特別講 sink
與 assign
這兩個 Operator
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 運作.
sink
, 取得分別可以應對收到結束與收到元素的執行閉包設定方式, 在這裡我習慣把這件事稱為 執行綁定
.recevieCompletion
的設定, 我們可以用 Promise
的方式, 注入對應成功或失敗的方式.Sink 有機會造成 Retain cycle.
沒錯, 只能是 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)
}
}