Swiftで遊ぼう! - 525 - Swiftでデザインパターン: Memento(メメント) 2
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- Swift2.1 & Xcode7.1対応の日本語版アップルチュートリアル!
メメントの勉強しています。
メメント・パターンとは、オブジェクトの現在の状態を切り取り、外部に保存する事で、オブジェクトの変化をした後も以前の状態に復元する方法です。
チュートリアルのプロジェクトの中で、アルバムアートワークを変化させてもアプリをバックグラウンドに戻して再びアプリに戻ったら最初のアルバムアートワークに戻っていました。この部分をメメントを使って復元させます。
「Originator」はViewControllerです。じゃあ「Memento」が何になるのでしょう。実は、アルバムアートワークの順番を保持するプロパティ「currentAlbumIndex」を保存するクラスです。
iOSフレームワークを利用しているので、こういうセーブとロードをするクラスを自作する必要がありません。NSUserDefaultsを使います。当然シングルトン・パターンで仕様です。
Originatorクラスにはデータをセーブとロードをするメソッドを実装させる必要があります。ViewControllerの中に次の2つのメソッドを入れます。
// MARK: Memento Pattern func saveCurrentState() { NSUserDefaults.standardUserDefaults().setInteger(currentAlbumIndex, forKey: "currentAlbumIndex") } func loadPreviousState() { currentAlbumIndex = NSUserDefaults.standardUserDefaults().integerForKey("currentAlbumIndex") showDataForAlbum(currentAlbumIndex) }
実はメメントのクラス図に書いてあるように、このメソッドを管理する「caretaker」クラスの実装が重要なんです。どのタイミングでセーブとロードをさせるか?
まず必ずロードしなければならないのがviewDidload内でメソッドを呼びます。
loadPreviousState()
次はどのタイミングでセーブするメソッドを呼ぶか? チュートリアルではアプリケーションがバックグラウンドに入るときにポストされるNSNotificationメッセージを利用しています。これはオブザーバー・パターンですね。
viewDidLoardが呼ばれた時にViewController自身をNSNotificationCenterに登録させるのでviewDIdLoad内に次のコードを加えます。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "saveCurrentState", name: UIApplicationDidEnterBackgroundNotification, object: nil)
Notificationで重要なのは後片付けです。必ず次のデイニシャライザを加えます。
deinit { NSNotificationCenter.defaultCenter().removeObserver(self) }
これで問題無くあるバームアートのの順番を覚えてくれます。
今日はここまで。