2012-04-04 4 views
0

私は最近音楽プレーヤーを開発しています。私は自分のピッカーを書いています。 私のコードを制限しようとしているので、私のiPhoneに約1600枚のアルバムがあります。何千もの画像をキャッシュする

私はAQGridViewをアルバムビューに使用しています.MPMediaItemArtworkはNSObjectのサブクラスであるため、イメージを取得するためにはメソッドを起動する必要があり、そのメソッドは画像を拡大/縮小します。

各セルのスケーリングは、あまりにも多くのCPUを使用しているため、私のグリッドアルバムの表示は手間がかかります。

私はアプリの起動時にGCDでスケーリングを開始し、それらをファイルに保存し、各セルのファイルを読み込むことを考えました。

しかし、私のコードAppDelegateのアプリケーションで

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 

    MPMediaQuery *allAlbumsQuery = [MPMediaQuery albumsQuery]; 
    NSArray *albumsArray = allAlbumsQuery.collections; 

    for (MPMediaItemCollection *collection in albumsArray) { 

     @autoreleasepool { 
     MPMediaItem *currentItem = [collection representativeItem]; 
     MPMediaItemArtwork *artwork = [currentItem valueForProperty:MPMediaItemPropertyArtwork]; 
     UIImage *artworkImage = [artwork imageWithSize:CGSizeMake(90, 90)]; 

     if (artworkImage) [toBeCached addObject:artworkImage]; 
     else [toBeCached addObject:blackImage]; 

     NSLog(@"%@", [currentItem valueForProperty:MPMediaItemPropertyAlbumTitle]); 
     artworkImage = nil; 
     } 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:albumsArray] forKey:@"covers"]; 
    }); 
    NSLog(@"finished saving, sir"); 
}); 

:didFinishLaunchingWithOptions:メソッドは、私のアプリのクラッシュを行い、任意のコンソールなしでログインするなど

これは、メモリの問題のようですが、非常に多くの画像が保存されますNSArrayは私のアプリを閉じるためにRAMに保存されます。

どうすればよいですか?

乾杯

+0

NSDataでメモリマッピングを調べます。 –

+0

これを少し開くことができますか? –

答えて

2

はNSCacheとオンディスクキャッシュを組み合わせた、最近リリースさSYCacheを見てみましょう。あなたがアプリケーションを起動するとすぐにメモリ警告状態になるのはおそらく悪い考えですが、強制終了よりも優れています。

マップされたデータは、mmapまたはそれと同等のものを使ってディスクからデータを読み込んで一度にメモリに読み込む技術であり、後でUIImageをロードする際に役立ちます。逆(NSMutableDataの場合)も真です。つまり、RAMに直接あるかのようにファイルを書き込むことができます。テクニックとしては、役に立つかもしれません。

関連する問題