スキップしてメイン コンテンツに移動

[iOS]初めてのiPhoneアプリ -コントローラ間のデータ受け渡し 其の三-

iOSのデータ受け渡し第3回は、オブジェクトをアーカイブして保存するパターンを試します。
この方法はデータの受け渡し以外にも、というよりは、データ永続化を目的に利用する事が多いパターンになるようです。




アーカイブを利用したデータの受け渡し(永続化)の手順は以下のようになります。
  1. アーカイブ用のクラスを作成する
  2. データの格納
  3. アーカイブする
  4. アンアーカイブする

アーカイブ用のクラスを作成する

まずはアーカイブするデータを格納する変数とアーカイブに関するメソッドを備えたクラスを作成します。
このクラスは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などでデータの取得が可能
    }
}

以上です。
アーカイブしたデータはコントローラ間はもちろん、ファイルに書きだして保存するため再起動時にもデータの取得が可能です。
こちらも非常に簡単に扱えるようになっていますね。


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。