Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 525 - Swiftでデザインパターン: Memento(メメント) 2

メメントの勉強しています。

www.raywenderlich.com

メメント・パターンとは、オブジェクトの現在の状態を切り取り、外部に保存する事で、オブジェクトの変化をした後も以前の状態に復元する方法です。

チュートリアルのプロジェクトの中で、アルバムアートワークを変化させてもアプリをバックグラウンドに戻して再びアプリに戻ったら最初のアルバムアートワークに戻っていました。この部分をメメントを使って復元させます。

「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)
}

これで問題無くあるバームアートのの順番を覚えてくれます。

今日はここまで。