缓存数千个图像



我最近一直在开发一款音乐播放器,我正在编写自己的pickers。我正在尝试对我的代码进行极限测试,所以我的iPhone中有大约1600张专辑。

我使用AQGridView进行相册视图,由于MPMediaItemArtwork是NSObject的一个子类,因此需要在其上启动一个方法来从中获取图像,并且该方法可以缩放图像。

正如你所猜测的,每个单元格的缩放使用了太多的CPU,所以我的网格相册视图很滞后,尽管我尽了所有的努力手动驱动每个单元格的include。

所以我想在应用程序启动时开始使用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中,NSArray存储在RAM上,直到保存iOS强制关闭我的应用程序。

你对该怎么做有什么建议吗?

干杯

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

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

最新更新