我最近一直在开发一款音乐播放器,我正在编写自己的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中一样写入。作为一种技术,它可能是有用的。