はてなブックマークに追加

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
はてなブックマークに追加

iPhone ネットワークプログラミング その3




サイトを移行しました。
iPhoneアプリと、そのプログラム



第3回:ファイルのダウンロード

前回にひきつづき、ネットワークプログラミングその3では、
Web上からファイルをダウンロードしてきて
iPhoneに保存するプログラムを紹介します。

CoCoaフレームワークにはNSURLDownload
というクラスがあり、非常に簡単にファイルをダウンロードできるのですが、
iPhoneではこのクラスが実装されていないため、
NSURLConnectionクラスを使って自作する必要があります。


といっても、前回のプログラムと大きくは違わないので
簡単に理解できるかと思います。

sampleViewController.h
@interface networkViewController : UIViewController {
NSFileHandle *file;
NSString *filePath;
}
@end

sampleViewController.m
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"completed!");
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if (file == nil) {
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:filePath contents:[NSData data] attributes:nil];
file = [[NSFileHandle fileHandleForWritingAtPath:filePath] retain];
}
[file writeData:data];
}

- (void)viewDidLoad {
[super viewDidLoad];

NSString *url = [NSString stringWithString:
@"http://www.ritsumei.ac.jp/acd/mr/lib/images/calender/kin.pdf"];
NSString *directoryPath = [[NSHomeDirectory()
stringByAppendingPathComponent:@"tmp"] retain];
NSString *fileName = [url lastPathComponent];
filePath = [[[directoryPath stringByAppendingPathComponent:fileName]
stringByStandardizingPath] retain];
NSLog(@"%@", filePath);

NSURLRequest *request = [ NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[ NSURLConnection connectionWithRequest: request delegate: self ];
}


これまでと同じく、ViewControllerのクラスに直接
プログラムを書いていきます。
理解しやすいよう、例外処理などは書いてないので
iPhoneに実装する際には追加が必要です。


viewDidLoadメソッドの中身から見ていきましょう。
NSURLConnectionを使って非同期でリクエストを送っているので
大半は前回と同様のプログラムになっています。
違いは、NSURLRequestを作る前に、
ダウンロードするURL、ダウンロードファイル名、ダウンロード先フォルダ
などのパスを設定している部分だけです。

2行目で、対象ファイルのあるURLの指定、
3行目で、保存するディレクトリパス(今回はtmpフォルダ)
4行目で、対象ファイルのファイル名を指定して
5行目で、保存するファイルパスを指定しています。

4行目で使用している、lastPathComponentというメソッドは
パスからファイル名だけを取り出せる便利なメソッドです。
例えばパスが
http://www.ritsumei.ac.jp/acd/mr/lib/images/calender/kin.pdf
であれば、lastPathComponentの戻り値はkin.pdfとなります。


あとは、デリゲートの説明です。
connectionDidFinishLoading:
connection:didReceiveData:
上の二つのメソッドがデリゲートとなっており、
前者はダウンロードが完了したときにトリガされます。
また、後者はサーバからデータが送られてくるごとに呼び出されます。
こちらのメソッドは数回に分けて呼び出されるため、
メソッド内のプログラムも、それに対応したものになっています。

connection:didReceiveData:
のメソッドでは最初に呼び出されたときにファイルを作成し、
次の呼び出しからはそのファイルに追記していく処理を行っています。
(データが数回に分けて送られてくるため、このような処理になります)


さて、実行してみてください。
うまくいけば、コンソールにファイルのパスとcompleted!と表示されます。
Finderから表示されたファイルパスを辿ってみてください。
実際にファイルが保存されていれば成功です。




スポンサーサイト

コメントの投稿

非公開コメント

開発アプリ

iDOF 色影 ラテアート ぱすてる

プロフィール

hokuson

Author:hokuson
京都在住。iPhoneアプリ「色影」や「iDOF」の開発者。アプリのレビューとかもしてみる。博士後期課程@R大学。ついに就職活動なるものをしなければいけないらしい。誰か雇ってください。笑。

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
カテゴリ
最新コメント
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。