💭

Swift: Combine を学ぶ(己向け)

2021/09/08に公開

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で値を保持しないときに使う。
      • 毎回データを更新するような場合はこれが便利。
  • 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:)
    • 指定した秒数を指定したスケジューラーでまった後流す。

receive(on:options:)

pub.sink {
    DispatchQueue.main.async {
    }
}
// ↑は↓と同じこと
pub.receive(on: DispatchQueue.main).sink {
}

Discussion