アーカイブの使用方法
4796 ワード
まず、このクラスがアーカイブ可能であることを宣言するために、AlbumにNSCodingプロトコルを実装する必要があります.Albumを開くswiftはclassの行の後ろにNSCodingを付けます.
次に、次の2つの方法を追加します.
EncodeWithCoderメソッドはNSCodingの一部であり,アーカイブされたときに呼び出される.対照的にinit(coder:)法はアーカイブを解くために用いられる.簡単で、強いです.Albumオブジェクトをアーカイブし、Albumデータを格納およびロードするコードを追加できます.PersistencyManagerでswiftには次のコードが追加されています.
この方法はアルバムを格納するために使用することができる.NSKeyedArchiverはアルバムの配列をalbumsにアーカイブした.binという書類の中にあります.サブオブジェクトを含むオブジェクトをアーカイブすると、自動的にアーカイブされたサブオブジェクトが再帰され、サブオブジェクトのサブオブジェクトが再帰されます.私たちの例では、albumsをアーカイブしています.ArrayとAlbumはNSCopyingインタフェースを実現しているので、配列内のオブジェクトは自動的にアーカイブできます.PersistencyManagerのinitメソッドを次のコードで置き換えます.
私たちはアルバムデータを作成する方法をcreatePlaceholderAlbumに入れて、コードの可読性を高めました.新しいコードでは、アーカイブファイルが存在する場合、NSKeyedUnarchiverはアーカイブファイルからデータをロードします.そうでない場合は、アーカイブファイルを作成します.これにより、次回のプログラムの起動時にローカルファイルのロードデータを読み取ることができます.また、プログラムがバックグラウンドに入るたびにアルバムデータを格納したいと考えています.この機能は必須ではないように見えますが、後で編集機能を追加する必要がある場合は、新しいデータがローカルのアーカイブファイルに同期されることを確認したいと思っています.私たちのプログラムはLibraryAPIを通じてすべてのサービスにアクセスするため、LibraryAPIを通じてPersistencyManagerにアルバムデータの保存を通知する必要があります.LibraryAPIにアルバムデータを格納する方法を追加します.
この方法は簡単で、LibraryAPIのsaveAlbumsメソッドをpersistencyManagerのsaveAlbumsメソッドに渡します.そしてViewControllerでswiftのsaveCurrentStateメソッドの最後に:
ViewControllerがステータスを格納する必要がある場合、上記のコードはLibraryAPIを介して現在のアルバムデータをアーカイブします.プログラムを実行して、コンパイルエラーがないことを確認します.残念なことに、アーカイブが正しく完了しているかどうかを確認する簡単な方法はないようです.Documentsディレクトリをチェックして、アーカイブファイルが存在するかどうかを確認できます.他のデータの変化を見るには、アルバムデータを編集する機能も追加する必要があります.しかし、データを編集するよりも、アルバムを削除する機能を追加したほうがいいようです.このアルバムを直接削除したくなければいいです.さらに、万一誤って削除したら、取り消しボタンを追加してもいいのではないでしょうか.
class Album: NSObject, NSCoding {
次に、次の2つの方法を追加します.
required init(coder decoder: NSCoder) {
super.init()
self.title = decoder.decodeObjectForKey("title") as! String
self.artist = decoder.decodeObjectForKey("artist")as! String
self.genre = decoder.decodeObjectForKey("genre") as! String?
self.coverUrl = decoder.decodeObjectForKey("cover_url")as! String
self.year = decoder.decodeObjectForKey("year") as! String
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(title, forKey: "title")
aCoder.encodeObject(artist, forKey: "artist")
aCoder.encodeObject(genre, forKey: "genre")
aCoder.encodeObject(coverUrl, forKey: "cover_url")
aCoder.encodeObject(year, forKey: "year")
}
EncodeWithCoderメソッドはNSCodingの一部であり,アーカイブされたときに呼び出される.対照的にinit(coder:)法はアーカイブを解くために用いられる.簡単で、強いです.Albumオブジェクトをアーカイブし、Albumデータを格納およびロードするコードを追加できます.PersistencyManagerでswiftには次のコードが追加されています.
func saveAlbums() {
let filename = NSHomeDirectory().stringByAppendingString("/Documents/albums.bin")
let data = NSKeyedArchiver.archivedDataWithRootObject(albums)
data.writeToFile(filename, atomically: true)
}
この方法はアルバムを格納するために使用することができる.NSKeyedArchiverはアルバムの配列をalbumsにアーカイブした.binという書類の中にあります.サブオブジェクトを含むオブジェクトをアーカイブすると、自動的にアーカイブされたサブオブジェクトが再帰され、サブオブジェクトのサブオブジェクトが再帰されます.私たちの例では、albumsをアーカイブしています.ArrayとAlbumはNSCopyingインタフェースを実現しているので、配列内のオブジェクトは自動的にアーカイブできます.PersistencyManagerのinitメソッドを次のコードで置き換えます.
override init() {
super.init()
if let data = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Documents/albums.bin")) {
let unarchiveAlbums = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [Album]
if let unwrappedAlbum : [Album] = unarchiveAlbums {
albums = unwrappedAlbum
}
} else {
createPlaceholderAlbum()
}
}
func createPlaceholderAlbum() {
//Dummy list of albums
let album1 = Album(title: "Best of Bowie",
artist: "David Bowie",
genre: "Pop",
coverUrl: "http://www.coversproject.com/static/thumbs/album/album_david%20bowie_best%20of%20bowie.png",
year: "1992")
let album2 = Album(title: "It's My Life",
artist: "No Doubt",
genre: "Pop",
coverUrl: "http://www.coversproject.com/static/thumbs/album/album_no%20doubt_its%20my%20life%20%20bathwater.png",
year: "2003")
let album3 = Album(title: "Nothing Like The Sun",
artist: "Sting",
genre: "Pop",
coverUrl: "http://www.coversproject.com/static/thumbs/album/album_sting_nothing%20like%20the%20sun.png",
year: "1999")
let album4 = Album(title: "Staring at the Sun",
artist: "U2",
genre: "Pop",
coverUrl: "http://www.coversproject.com/static/thumbs/album/album_u2_staring%20at%20the%20sun.png",
year: "2000")
let album5 = Album(title: "American Pie",
artist: "Madonna",
genre: "Pop",
coverUrl: "http://www.coversproject.com/static/thumbs/album/album_madonna_american%20pie.png",
year: "2000")
albums = [album1, album2, album3, album4, album5]
saveAlbums()
}
私たちはアルバムデータを作成する方法をcreatePlaceholderAlbumに入れて、コードの可読性を高めました.新しいコードでは、アーカイブファイルが存在する場合、NSKeyedUnarchiverはアーカイブファイルからデータをロードします.そうでない場合は、アーカイブファイルを作成します.これにより、次回のプログラムの起動時にローカルファイルのロードデータを読み取ることができます.また、プログラムがバックグラウンドに入るたびにアルバムデータを格納したいと考えています.この機能は必須ではないように見えますが、後で編集機能を追加する必要がある場合は、新しいデータがローカルのアーカイブファイルに同期されることを確認したいと思っています.私たちのプログラムはLibraryAPIを通じてすべてのサービスにアクセスするため、LibraryAPIを通じてPersistencyManagerにアルバムデータの保存を通知する必要があります.LibraryAPIにアルバムデータを格納する方法を追加します.
func saveAlbums() {
persistencyManager.saveAlbums()
}
この方法は簡単で、LibraryAPIのsaveAlbumsメソッドをpersistencyManagerのsaveAlbumsメソッドに渡します.そしてViewControllerでswiftのsaveCurrentStateメソッドの最後に:
LibraryAPI.sharedInstance.saveAlbums()
ViewControllerがステータスを格納する必要がある場合、上記のコードはLibraryAPIを介して現在のアルバムデータをアーカイブします.プログラムを実行して、コンパイルエラーがないことを確認します.残念なことに、アーカイブが正しく完了しているかどうかを確認する簡単な方法はないようです.Documentsディレクトリをチェックして、アーカイブファイルが存在するかどうかを確認できます.他のデータの変化を見るには、アルバムデータを編集する機能も追加する必要があります.しかし、データを編集するよりも、アルバムを削除する機能を追加したほうがいいようです.このアルバムを直接削除したくなければいいです.さらに、万一誤って削除したら、取り消しボタンを追加してもいいのではないでしょうか.