缓存成千上万的图像

时间:2012-04-04 16:32:43

标签: objective-c buffer cpu ram mpmediaitem

我最近一直在开发一个音乐播放器,我正在编写自己的选择器。 我正在尝试测试我的代码是否有限制,所以我的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的应用程序中的

:didFinishLaunchingWithOptions:方法使我的应用程序崩溃,没有任何控制台日志等。

这似乎是一个内存问题,所以很多图像都保存在NSArray中,存储在RAM中,直到保存iOS强制关闭我的应用程序。

您对如何做有任何建议吗?

干杯

1 个答案:

答案 0 :(得分:2)

看看最近发布的SYCache,它结合了NSCache和磁盘缓存。启动应用程序后立即进入内存警告状态可能是一个坏主意,但这比强制关闭要好。

就上面提到的评论者而言,映射数据是一种技术(使用mmap或其等价物)从磁盘加载数据,就好像它一次全部存储在内存中一样,这有助于UIImage在以后加载。逆(使用NSMutableData)也是如此,即文件可以直接写入RAM中。作为一种技术,它可能很有用。