Objective c 缓存数千张图像
我最近一直在开发一款音乐播放器,我正在编写自己的选择器。 我正试图测试我的代码,以达到它的极限,所以我的iPhone里有大约1600张专辑 我将AQGridView用于albums view,由于MPMediaItemArtwork是NSObject的一个子类,因此需要在其上启动一个方法以从中获取图像,并且该方法可以缩放图像 正如您所能猜到的,每个单元的扩展都会占用太多的CPU,因此我的网格相册视图很落后,尽管我尽了所有努力手动驱动每个单元的包含 所以我想在应用程序启动时开始使用GCD进行扩展,然后将它们保存到文件中,并为每个单元读取该文件 但是,我的代码Objective c 缓存数千张图像,objective-c,buffer,cpu,ram,mpmediaitem,Objective C,Buffer,Cpu,Ram,Mpmediaitem,我最近一直在开发一款音乐播放器,我正在编写自己的选择器。 我正试图测试我的代码,以达到它的极限,所以我的iPhone里有大约1600张专辑 我将AQGridView用于albums view,由于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:method使我的应用程序崩溃,没有任何控制台日志等
这似乎是一个内存问题,所以很多图像都保存在NSArray中,并存储在RAM中,直到iOS强制关闭我的应用程序
你有什么建议吗
干杯看看最近发布的,它结合了NSCache和磁盘缓存。启动应用程序后立即进入内存警告状态可能不是个好主意,但这比强制关闭要好
正如上面的评论者所建议的,映射数据是一种从磁盘加载数据的技术(使用mmap或其等效工具),就好像数据一次全部在内存中一样,这有助于以后加载UIImage。反过来(使用NSMutableData)也是正确的,文件可以像直接在RAM中一样写入。作为一种技术,它可能很有用。查看NSData的内存映射。你能稍微打开一下吗?