💭
Swift: Combine を学ぶ(己向け)
Swift、AppKit、Storyboard環境でのCombineの使い方について学習する。
下準備
StoryboadにLabelとButtonを配置してViewControllerに繋いでおく。
ViewController.swift
import Cocoa
import Combine
class ViewController: NSViewController {
@IBOutlet weak var textField: NSTextField!
@IBOutlet weak var button: NSButton!
override func viewDidLoad() {
super.viewDidLoad()
}
}
Model.swiftを用意する。
Model.swift
import Foundation
import Combine
class Model {
}
メモ
Combine Framework
- 時間の経過とともに値を処理するための宣言的なSwift APIを提供する。
- 多くの種類の非同期イベントを表現することができる。
- Publisher
- 時間の経過とともに変化する値を公開する。
- Subscriber
- Publisherから値を受け取る。
- Combineで流せるイベント
- 値
- 完了
- 失敗
- AnyPublisher
- Publisherの基本の型
- Subject
- Publisherの一つ。Publisherは値が変化したときにイベントが流れるだけ。Subjectは
send
によって意図的にイベントを流せる。 - SubjectをPublisherのように振る舞わせるには、
eraseToAnyPublisher()
を用いればいい。 - CurrentValueSubject
- Publisherで値を保持したいときに使う。
- 値を保持するために初期値を渡す必要がある。
- PassthroughSubject
- Publisherで値を保持しないときに使う。
- 毎回データを更新するような場合はこれが便利。
- Publisherの一つ。Publisherは値が変化したときにイベントが流れるだけ。Subjectは
- Cancellable
- sink
- Publisherを流れてくるデータを購読するのにつかう。
- 戻り値はAnyCancellable。これを保持している間、購読が有効になる。
- sink(receiveValue:)は失敗しない系
- sink(receiveCompletion:receiveValue:)は失敗がありうる系。エラーハンドリングが必要
- assign
- Publisherから流れてくるデータをオブジェクトにバインディングするのに使う。
- assign(to:on:)
- 戻り値はAnyCancellable。これを保持している間、購読が有効になる。 - assign(to:)
- 戻り値なし。toに指定したPublishedな変数とともに管理され、それが破棄されるときに自動で破棄される。
- receive(on:)
- これ以降の処理を引数で指定したスレッドで実行するようにする。
- subscrive(on:)
- delay(for:scheduler:)
- 指定した秒数を指定したスケジューラーでまった後流す。
pub.sink {
DispatchQueue.main.async {
}
}
// ↑は↓と同じこと
pub.receive(on: DispatchQueue.main).sink {
}
Discussion