Hatena::ブログ(Diary)

Windchase

2008.10.24

iPhone 用の画像ダウンロードライブラリ ImageStore を公開

iPhone 用の画像ダウンロードライブラリ、ImageStore のソースコードを公開します。

http://github.com/psychs/imagestore/tree/master

ライセンスは、New BSD ライセンスです。

使い方

まず、ImageStore を初期化して、インスタンス変数に保持しておきます。

imageStore = [[ImageStore alloc] initWithDelegate:self];

そして、画像をダウンロードしたくなったら、getImage を呼び、画像の URL を渡してやります。

[imageStore getImage:imageUrl];

getImage の呼び出しはすぐに戻り、ImageStore は裏で非同期に画像のダウンロードをはじめます。

ダウンロードが終わると、delegate の imageStoreDidGetNewImage:url: が呼ばれるので、そこで画像を使った処理をしてください。

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url
{
    UIImage* image = [sender getImage:url];

    // 画像を使う処理
}

一度ダウンロードした画像は、ImageStore の内部にキャッシュしているので、次回からは getImage ですぐに画像を取得できます。(返値が nil のときは、まだ未取得なのでダウンロードを始めます)

UIImage* image = [imageStore getImage:imageUrl];

詳しい説明

内部的には NSURLConnection を使っているので、いくつもの画像を同時に並行してダウンロードすることができます。

サンプルプロジェクトとして、Twitter のパブリックタイムラインを表示するアプリを作りました。

f:id:Psychs:20081027092221p:image:w160

スクロールしていくと、表示が必要になったら画像のダウンロードを始め、それが終わったら画像を表示する様子が確認できると思います。

その他、NSURLConnection を使いやすくラップした HttpClient、角丸画像の描画サンプル、UITableViewCell の高速な描画コードなども含んでいるので、ぜひ参考にしてみてください。

八咫烏八咫烏 2011/03/09 17:35 はじめまして、お世話になります。
現在、ImageStoreのコードを使用させて頂き、
TableView(Tabbar、Navigationあり)に非同期でイメージを表示させているのですが、
表示途中で、Tab切替等の操作をした場合、
imageDownloderの割り込みが発生してしまいます。
ダウンロード処理をの中断(停止)させたいのですが、
どの様に処理(記述)すればよろしいのでしょうか?
初心者レベルの質問で申し訳ありませんが、
ご教授願えないでしょうか?
よろしくお願い致します。

PsychsPsychs 2011/03/09 18:30 ImageStore クラスが全部のコネクションを保持しているので、cancelAll のようなメソッドを増やして、そこで全部のコネクションを cancel して破棄すればいいでしょう。

八咫烏八咫烏 2011/03/09 21:50 度々、恐れ入りますが、「全部のコネクションを cancel して破棄」とは、
具体的にどの様にすればよいのでしょうか?

(dealloc処理)下記の様にして viewDidDisappear で呼び出す様に してみたのですが、うまくいきません。
- (void)cancelAll {
conns = nil;
[conns release];
}

誠に申し訳ありませんが、よろしくお願い致します。

のらいぬのすけのらいぬのすけ 2011/09/29 15:47
はじめまして、いつも参考にさせて頂いております。

サンプルプロジェクトのTwitter のパブリックタイムラインをカスタマイズしようと思っているのですが

RootViewControllerに該当するmファイルで

[self.navigationController popViewControllerAnimated:YES];

を実行すると

以下の部分で止まり、

if ([delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) {

[HogeViewController respondsToSelector:]: message sent to deallocated instance 0x6a63140

と落ちてしまいます。

0x6a63140の該当部分は「delegate = (_NSZombie_HogeViewController *)0×6a63140<Zombie>となっております。

手も足も出ない状態で困窮しているのですが、何か心当たりなどありましたらアドバイスを頂けないでしょうか?

どうぞ宜しくお願い致します。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。