【iPhone SDK】インターネットから取得したバイナリデータを保存する、また保存したデータを読み込む

インターネットにアクセスし、
サーバーからバイナリデータを落としてきてローカルに保存。
次回起動時はその保存したバイナリデータを読み込むっといった処理を実行する部分を作成しました。

設定情報の保存・読み込みならこちらのサイトで解説されています NSUserDefault でxmlのように管理ができるのですが、
データの場合どうするのかなぁと思い調べてみました。NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentPath = [paths objectAtIndex: 0];
NSString* filePath = [documentPath stringByAppendingPathComponent: @"ファイル名"];

この処理により、filePath変数にアプリ毎のローカルパスにファイル名を加えたパスが代入されます。

読み込み時、このパスを取得し存在有無をチェックすることで読み込み処理は問題ないかと思います。


if([[NSFileManager defaultManager] fileExistsAtPath: filePath]){
// 読み込み処理
}


では、サーバーからそのファイルを保存する部分を見ていきましょう

サーバーからデータを受信するにはNSURLRequestとNSURLConnectionを使用します。

// メンバ変数に以下を定義しておく
NSMutableData* m_pReceivedData;
----------------------------------
NSURL* url = [NSURL URLWithString: @"http://サーバーのURL"];
NSURLRequest* request = [NSURLRequest requestWithURL: url];
NSURLConnection* connection = [NSURLConnection connectionWithRequest: request delegate: self];

if(connection){
 m_pReceivedData = [NSMutableData alloc];
}


そして後はコールバック関数を用意してそこで取得と保存を行います。


// データを受信した時のコールバック関数
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
 [m_pReceivedData appendData: data];
}

// すべての通信が完了した時のコールバック関数
- (void) connectionDidFinishLoading:(NSURLConnection *)connection{
 
 // 取得したデータを指定したパスで出力
 [m_pReceivedData writeToFile: filePath atomically: YES];
}


受信するたびに配列にどんどんデータ追加していき、
完了したときにファイルとして出力っという手順になります。

出力時のfilePathは最初にのべた手法で取得しておいてくださいよ

こんな感じでサーバーから受信したものを取り扱うことができました。




この記事へのコメント


この記事へのトラックバック