2012-04-04 84 views
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:方法中,使我的应用程序崩溃,没有任何控制台登录等

这似乎是内存的问题,这么多的图像保存在存储在RAM中的NSArray中,直到保存了iOS部队关闭我的应用程序。

你有什么建议做什么?

干杯

+0

调查与NSData的内存映射。 – 2012-04-04 16:36:48

+0

你可以打开一下吗? – 2012-04-04 16:38:10

回答

2

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

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