2009-06-27
ImageStoreのコードリーディング
ImageStore | |
![]()
ImageStoreは画像ダウンロードにおいて使い勝手のいいフレームワークです。使い方も開発者自身が提示しているので迷いません。
実際にはこんな感じ。
#import "ImageStore.h" //-------------(途中略) - (void)viewDidLoad { [super viewDidLoad]; imageStore = [[ImageStore alloc] initWithDelegate:self]; [imageStore getImage:@"http://assets0.twitter.com/images/twitter_logo_header.png"]; } - (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url { UIImage* image = [sender getImage:url]; // 画像を使う処理 }
ただ、ここまで使い勝手がいいとなると、どんな処理がなされているか気になるものです。そこで、勉強がてらにコードリーディング。
構成
ImageStoreは、
- HttpClient
- ImageDownloader
- ImageStore
- StringHelper
の4つのクラスで構成されています。
HttpClient
実際に画像をダウンロードするクラスです。delegateメソッドとしてNSObjectにHttpClientDelegateカテゴリを構成します。NSURLRequestの結果に応じてHttpClientDelegateカテゴリ内のメソッドを実行します。
ImageDownloader
HttpClientをラップするクラスです。delegateメソッドとしてNSObjectにImageDownloaderDelegateカテゴリを構成します。HttpClientの結果に応じてImageDownloaderDelegateカテゴリ内のメソッドを実行します。
ImageStore
Developerが実際に触れるクラスです。ImageDownloaderをラップしています。delegateメソッドとして、ImageStoreにPrivateカテゴリを構成します。DeveloperはPrivateカテゴリのメソッド内にて実際に取得した画像に対する処理を行います。
StringHelper
HttpClient内にて、URLRequestの際のクエリを組み立てる時に用いられるクラスです。
処理の実際
各クラス同士は以下のような具合にやり取りしています。
プロトコルでは無い理由
プロトコル化することで、NSObjectを汚染せずにコーディングすることも可能です。ImageStoreの場合はあえてNSObjectにいれることで、コーディングに掛かる工数を減らしています。

delegateメソッドで幾つか用いられていないものがあったので、そこらへんをもうちょっと踏み込み必要みたいです。
informal protocolについては、SDKのヘッダを見ていて「なんか書かれてるー」という程度の認識で、以前protocolを作ろうとしたとき、そこらへん分かってなくて全部formalにしちゃってました。まだまだ学習の余地ありです。