私は最近、音楽プレーヤーを開発しており、独自のピッカーを作成しています。コードを限界までテストしようとしているので、iPhone には約 1600 のアルバムがあります。
私はアルバム ビューに AQGridView を使用しています。MPMediaItemArtwork は NSObject のサブクラスであるため、そこから画像を取得するにはメソッドを起動する必要があり、そのメソッドは画像をスケーリングします。
ご想像のとおり、各セルのスケーリングは CPU を大量に使用するため、各セルのインクルードを手動で駆動するためにあらゆる努力を払ったにもかかわらず、グリッド アルバム ビューは遅延します。
そこで、アプリの起動時に GCD でスケーリングを開始し、ファイルに保存して、セルごとにそのファイルを読み取ることを考えました。
しかし、私のコード
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");
});
AppDelegate の application:didFinishLaunchingWithOptions: メソッドで、コンソール ログなどなしでアプリがクラッシュします。
これはメモリの問題であると思われるため、多くの画像が NSArray に保持され、iOS 強制保存によってアプリが閉じられるまで RAM に保存されます。
何をすべきかについて何か提案はありますか?
乾杯