意外と日本語のエントリが少ないのでメモ。
PDFページの表示など、レンダリングして画像イメージを生成するのに非常に時間がかかってユーザビリティを損ねる場合、あらかじめプリレンダリングした画像イメージをキャッシュとして置いておきたい。しかしiOSデバイスはメモリ制限が厳しいため、ディスクやCore Dataストレージ等に書き出しておくのが現実的だろう。
ビットマップコンテキストに何かしら描画を行った後、
CGImageRef image = CGBitmapContextCreateImage ( context ); NSData *renderedImage = UIImageJPEGRepresentation([UIImage imageWithCGImage:image ],0.5);
(ここで0.5と指定しているのはJPEG圧縮の品質。)
もしくはPNG形式なら、
NSData *renderedImage = UIImagePNGRepresentation([UIImage imageWithCGImage:image ]);
を呼び出してやることでと、JPEG/PNG形式の画像データをを内容に持つNSDataオブジェクトが取得できるようだ。あとは、このrenderedImageを、Core DataならManaged objectのプロパティに代入してsaveするか、アプリのドキュメントディレクトリなどに直接保存するならNSData#writeToXXX系のメソッドを使えば永続化できる。
次にキャッシュしたイメージを再表示するには、読み出してきたrederedImageからCGDataProviderを作成し、CGImageCreateWithJPEGDataProviderもしくはCGImageCreateWithPNGDataProviderに渡せばよい。
CGDataProviderRef provider = CGDataProviderCreateWithCFData ( (CFDataRef)renderedImage ); CGImageRef image = CGImageCreateWithJPEGDataProvider ( provider, NULL, FALSE, kCGRenderingIntentDefault ); CGDataProviderRelease(provider);