hmhv

MobSの紹介

2020-05-03

MobSとは

MobSはMobX, RxSwift, Combineからインスピレーションを受け、
SIMPLE & SAFEを目指したSwift製リアクティブライブラリです。  

MobSの対象ユーザ

  • RxSwiftは強すぎて息が苦しい方
  • SwiftUI+Combineのみで開発を進めるのはまだ早いと思う方

MobSの特徴

  • 簡単なインタフェース
  • メモリ管理はほぼ自動
  • State変更によるViewの更新処理に集中
  • 全ての処理はメインスレッドで処理

用語説明

Observable

変数の値を保持し、新しい値が設定されるたび、Observerに通知を行う。
MobX, RxSwiftのObservable、CombineのPublisherと同様の物

Observer

Observableに追加され、Observableからの通知を受けてアクションを実行する。
MobXのaction, RxSwiftのObserver、CombineのSubscriberと同様の物

Removable (Remover)

Observableに追加されたObserverをObservableから削除するための仕組み。
RxSwiftのDisposable、CombineのCancellableと同様の物

MobSの基本

それでは早速コードを確認しましょう。

class CountUpViewController: UIViewController {

// ①Observableの生成
@MobS.Observable(value: 0)
var count: Int

@IBOutlet weak var countLabel: UILabel!

override func viewDidLoad() {
super.viewDidLoad()

// ②Observerの生成&Observableに追加
addObserver { (self) in
self.countLabel.text = "\(self.count)"
}
}

@IBAction func buttonTapped(_ sender: Any) {
// ③Observableの更新
count += 1
}

}

こちらはボタンをタップするとcountが1増えてラベルに表示されるコードです。

①Observableの生成

@MobS.Observable(value: 0)
var count: Int

MobSのObservableはproperty wrapperで実装されているのでこのようにプロパティに@MobS.Observableを付けて生成します。
ObservableはObserverのクロージャの中で参照される瞬間、自動的にObserverを自分に追加します。
逆にObserverのクロージャ以外で参照されると一般のプロパティと同じです。

上のコードでは初期値0のInt型のObservable、countが生成されます。

②Observerの生成&Observableに追加

addObserver { (self) in
self.countLabel.text = "\(self.count)"
}

MobSのObserverはaddObserverメソッドに通知時に実行するアクションをクロージャとして渡して生成します。
生成されたObserverはクロージャの中で参照しているObservable(s)に自動で追加されて、Observableに新しい値が設定されるたび、実行されます。

上のコードではクロージャの中でcountが参照されているので、countに新しい値が設定されるたび、self.countLabel.text = "\(self.count)"が実行されます。

そして上のaddObserverメソッドはNSObjectの拡張メソッドで、以下のようなMobS.addObserverメソッドのラッパです。

MobS.addObserver { [weak self] in
guard let self = self else { return }
self.countLabel.text = "\(self.count)"
}.removed(by: remover)

addObserverで追加されたObserverは通知をうける必要がなくなると削除される必要があります。
NSObjectの拡張メソッドでは内部でremoved(by: remover)の呼出で自動で削除されるようになってます。
(これはRxSwiftのDisposable、DisposeBag、NSObject+Rxを合わせたのと同様の処理です)

上のコードではCountUpViewControllerでaddObserverを呼出したのでCountUpViewControllerのdeinitのタイミングで自動で削除されます。

③Observableの更新

count += 1

Observableの更新は一般的なプロパティと同じく値を設定するだけでいです。それでObservableは自分に追加されている全てのObserverに通知を行い、アクションが実行されます。

上のコードではcount += 1でObserverに自動で通知され、self.countLabel.text = "\(self.count)"が実行されます。

まとめ

以上でMobSの基本について説明しました。

実践で使うには以下の内容も理解する必要がありますので詳しくはコードとExampleをご確認ください。

  • UITableViewCellでの利用
  • updateState
  • Computed
  • Bind

コードとExampleは https://github.com/hmhv/MobS にあります

参考