#72 Combine基礎簡介

燮羽(will)
4 min readOct 8, 2022

--

Combine是什麼

在2019的WWDC,Apple爸爸推出了新的兩大框架Combine跟SwiftUI。 SwiftUI的出現,讓我們可以所見即所得的更快刻劃出炫砲的UI介面, 而今天要分享的Combine,則是類似於流水線概念的一種傳值方式,提供了我們在處理Asynchronous(非同步)時的另一個選擇。

Combine優缺點

優點:

  1. 同時支持一對一、一對多的觀察操作
  2. 資料的處理更集中
  3. 與MVVM天生一對,可以寫出更容易測試的ViewModel
  4. 更多我還不知道內容…

缺點:

  1. 學習成本有點高
  2. 與MVC不太合 ps.建議先了解:泛型、MVVM。比較不會寫起來一頭霧水

三大核心

  1. publisher — 發佈者,事件的源頭
  2. operator — 處理發佈者來得值
  3. 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)

參考文章

--

--

No responses yet