Combine是什麼
在2019的WWDC,Apple爸爸推出了新的兩大框架Combine跟SwiftUI。 SwiftUI的出現,讓我們可以所見即所得的更快刻劃出炫砲的UI介面, 而今天要分享的Combine,則是類似於流水線概念的一種傳值方式,提供了我們在處理Asynchronous(非同步)時的另一個選擇。
Combine優缺點
優點:
- 同時支持一對一、一對多的觀察操作
- 資料的處理更集中
- 與MVVM天生一對,可以寫出更容易測試的ViewModel
- 更多我還不知道內容…
缺點:
- 學習成本有點高
- 與MVC不太合 ps.建議先了解:泛型、MVVM。比較不會寫起來一頭霧水
三大核心
- publisher — 發佈者,事件的源頭
- operator — 處理發佈者來得值
- subscriber — 訂閱者,事件處理完的內容
每個部分都還有細分許多的用法,目前還在學習當中,所以想了解更多細節的操作,可以看一下官方教學
簡易範例
let weatherPublisher = PassthroughSubject<Int,Never>()
var cancellable: AnyCancellable
// 訂閱者
cancellable = weatherPublisher
// operator 處理值
.filter {$0 > 25}
.sink { result in
switch result {
case .finished:
print("finished")
}
} receiveValue: { value in
print("value", value)
// printr結果: value 30
}
weatherPublisher.send(30)
weatherPublisher.send(10)
weatherPublisher.send(15)
解釋:
- 首先宣告
PassthroughSubject
為發布者,要發布的資料為Int、Never - 宣告
AnyCancellable
,當事件結束時,解除訂閱 ps.備註一 - filter、sink都是operator,負責處理此次資料流
- filter跟大家知道的filter一樣,此次就是濾出大於25的數值往下傳
- sink主要工作是將收到value與結束通知時,執行相對應的動作,每次的事件傳遞一定都要有sink發動,不然
publisher
不會執行。 send
發佈值
備註一:
AnyCancellable
是當事件結束時使用,是由ARC管理- 當要管理更多事件流時,也可以改用以下方式
var anyCancellable = Set<AnyCancellable>()
weatherPublisher
// operator 處理值
.filter {$0 > 25}
.sink { result in
switch result {
case .finished:
print("finished")
}
} receiveValue: { value in
print("value", value)
}.store(in: &anyCancellable)