iOSのデータ受け渡し第3回は、オブジェクトをアーカイブして保存するパターンを試します。
この方法はデータの受け渡し以外にも、というよりは、データ永続化を目的に利用する事が多いパターンになるようです。
アーカイブを利用したデータの受け渡し(永続化)の手順は以下のようになります。
このクラスはNSCodingプロトコルに準じたものでないとアーカイブする事ができないようです。このNSCodingプロトコルの準拠に必要な2つのメソッドを追加したクラスをここでは作成します。
テスト用に作成したPersonクラスのコードを掲載します。
このクラスではnameとmailという2つの変数でデータを保持するようにします。
自作クラスの新規作成は、メニューから[File]→[New]→[File]と選び[Objective-C class]を選びます。
次にクラス名を入力し、サブクラスにNSObjectを選んで作成します。ここではクラス名にPersonと入力しました。
以下、Person.hとPerson.mの内容です。
以上で必要なものは用意できました。
ここでは省略しましたが、動作のトリガーになるボタンを2つ(保存用と読込み用)を作成し、そのボタンの[Did End On Exit]イベントにアタッチしたメソッドにそれぞれ書きました。
まず、自作クラスにデータを格納するあたりのコードです。
この自作クラスといえど、使い方は非常に簡単で、通常の変数と同じように新規作成してプロパティにデータを格納するだけです。
ファイルパスを取得する方法とアーカイブの部分を掲載します。
よって、アーカイブした後にif文でsuccessの中身を評価することで、無事保存できたか何らかの事情でできなかったか結果を取得できます。
手順を逆に取るといっても、コードを逆から書くのではなく、NSKeyedArchiverに対応するNSKeyedUnarchiverを使うという意味です(知ってるよって)。
NSKeyedUnarchiverの戻り値は、アーカイブしたNSArrayなので、ちゃんと受け取れるようにNSArrayで受けるようにします。
以上です。
アーカイブしたデータはコントローラ間はもちろん、ファイルに書きだして保存するため再起動時にもデータの取得が可能です。
こちらも非常に簡単に扱えるようになっていますね。
この方法はデータの受け渡し以外にも、というよりは、データ永続化を目的に利用する事が多いパターンになるようです。
アーカイブを利用したデータの受け渡し(永続化)の手順は以下のようになります。
アーカイブ用のクラスを作成する
まずはアーカイブするデータを格納する変数とアーカイブに関するメソッドを備えたクラスを作成します。このクラスはNSCodingプロトコルに準じたものでないとアーカイブする事ができないようです。このNSCodingプロトコルの準拠に必要な2つのメソッドを追加したクラスをここでは作成します。
テスト用に作成したPersonクラスのコードを掲載します。
このクラスではnameとmailという2つの変数でデータを保持するようにします。
自作クラスの新規作成は、メニューから[File]→[New]→[File]と選び[Objective-C class]を選びます。
次にクラス名を入力し、サブクラスにNSObjectを選んで作成します。ここではクラス名にPersonと入力しました。
以下、Person.hとPerson.mの内容です。
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject<NSCoding>{} @property (nonatomic) NSString *name; @property (nonatomic) NSString *mail; @end
// Person.m #import <Person.h> @implementation Person -(id)initWithCoder:(NSCoder *)aDecoder{ self = [super init]; if (self){ _name = [aDecoder decodeObjectForKey:@"name"]; _mail = [aDecoder decodeObjectForKey:@"mail"]; } return self; } -(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeObject:_mail forKey:@"mail"]; } -(void)dealloc{ // 変数の後始末 } @end
以上で必要なものは用意できました。
データの格納
データ保存用のクラスができたら、ViewControllerから読み込むコードを書いていきます。ここでは省略しましたが、動作のトリガーになるボタンを2つ(保存用と読込み用)を作成し、そのボタンの[Did End On Exit]イベントにアタッチしたメソッドにそれぞれ書きました。
まず、自作クラスにデータを格納するあたりのコードです。
Person *man = [[Person alloc] init]; man.name = @"george"; man.mail = @"geroge@example.com";
この自作クラスといえど、使い方は非常に簡単で、通常の変数と同じように新規作成してプロパティにデータを格納するだけです。
アーカイブする
アーカイブする処理は1行で済みますが、アーカイブするファイルパスを取得しておく必要があります。ファイルパスを取得する方法とアーカイブの部分を掲載します。
// アーカイブしたファイルを保存するファイルパスを取得する方法 NSString *directory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *filepath = [directory stringByAppendingPathComponent:@"data.dat"]; // アーカイブ NSArray *array = @[man]; // 上のコードで作成した変数を配列に格納する。複数の変数をカンマ区切りで格納することも可能。 BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:filepath];アーカイブが正常に完了した場合は変数successにYESが入ります。
よって、アーカイブした後にif文でsuccessの中身を評価することで、無事保存できたか何らかの事情でできなかったか結果を取得できます。
アンアーカイブする
先程アーカイブしたデータをアンアーカイブ(要は読み込み)するには、上記のアーカイブの逆の手順を取ります。手順を逆に取るといっても、コードを逆から書くのではなく、NSKeyedArchiverに対応するNSKeyedUnarchiverを使うという意味です(知ってるよって)。
NSKeyedUnarchiverの戻り値は、アーカイブしたNSArrayなので、ちゃんと受け取れるようにNSArrayで受けるようにします。
NSString *directory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *filepath = [directory stringByAppendingPathComponent:@"data.dat"]; NSArray *array = [NSKeyedUnarchiver unarchveObjectWithFile:filepath]; if (array){ for (Person *person in array){ //person.nameなどでデータの取得が可能 } }
以上です。
アーカイブしたデータはコントローラ間はもちろん、ファイルに書きだして保存するため再起動時にもデータの取得が可能です。
こちらも非常に簡単に扱えるようになっていますね。
コメント
コメントを投稿