0

私は最近、音楽プレーヤーを開発しており、独自のピッカーを作成しています。コードを限界までテストしようとしているので、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 に保存されます。

何をすべきかについて何か提案はありますか?

乾杯

4

1 に答える 1

2

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

上記のコメンターが示唆している限り、マップされたデータは (mmap またはそれに相当するものを使用して) ディスクからデータを一度にすべてメモリ内にあるかのようにロードする手法であり、後で UIImage をロードするのに役立ちます。その逆 (NSMutableData を使用) も当てはまり、ファイルが直接 RAM にあるかのように書き込むことができます。テクニックとして、役に立つかもしれません。

于 2012-04-04T17:14:01.193 に答える