Swiftで遊ぼう! on Hatena

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

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

メメントの勉強がまだまだ続いています。

www.raywenderlich.com

Albumクラスのデータを保存するPersistencyManagerクラスに保存機能としてsaveAlbumsメソッドを加えます。

func saveAlbums() {
 let filename = NSHomeDirectory().stringByAppendingString("/Documents/albums.bin")
 let data = NSKeyedArchiver.archivedDataWithRootObject(albums)
 data.writeToFile(filename, atomically: true)
}

これに加えてPersistencyManagerクラスのイニシャライザを変更します。

override init() {
 super.init()
 if let data = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Documents/albums.bin")) {
  let unarchiveAlbums = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [Album]?
  if let unwrppedAlbum = unarchiveAlbums {
   albums = unwrppedAlbum
  }
 } else {
  craatePlaceholderALbum()
 }
}
    
func craatePlaceholderALbum() {
 //Dummy list of albums
 let album1 = Album(title: "Let's Dance",
 artist: "David Bowie",
 genre: "Pop",
 coverUrl: "https://s3.amazonaws.com/CoverProject/album/album_david_bowie_lets_dance.png",
  year: "1980")
        
 let album2 = Album(title: "These Days",
 artist: "Bon Jovi",
 genre: "Pop",
 coverUrl: "https://s3.amazonaws.com/CoverProject/album/album_bon_jovi_these_days.png",
  year: "1994")
        
 let album3 = Album(title: "The Dream of the Blue Turtles",
 artist: "Sting",
 genre: "Pop",
 coverUrl: "https://s3.amazonaws.com/CoverProject/album/album_sting_dream_of_the_blue_turtles.png",
  year: "1985")
        
 let album4 = Album(title: "Rattle and Hum",
 artist: "U2",
 genre: "Pop",
 coverUrl: "https://s3.amazonaws.com/CoverProject/album/album_u2_rattle_and_hum.png",
  year: "1990")
        
 let album5 = Album(title: "Something to Remember",
 artist: "Madonna",
 genre: "Pop",
 coverUrl: "https://s3.amazonaws.com/CoverProject/album/album_madonna_something_to_remember.png",
  year: "2002")
        
 albums = [album1!, album2!, album3!, album4!, album5!]
 saveAlbums()
}

そしてファサード・モデルでAPIをLibrarryAPIクラスでメソッドをコントロールしているのでLibraryAPIクラスに次のメソッドを組み込みます。

func saveAlbums() {
 persistencyManager.saveAlbums()
}

したがってpersistencyManagerのメソッドは直接使わず必ずLibraryAPIを介して利用するようにします。ViewControllerクラスのsaveCurrentState()メソッドに次のコードを加えます。

LibraryAPI.sharedInstance.saveAlbums()

これで完了です。

今日はここまで。