我最近一直在开发一个音乐播放器,我正在编写自己的选择器。 我正在尝试测试我的代码是否有限制,所以我的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强制关闭我的应用程序。
您对如何做有任何建议吗?
干杯
答案 0 :(得分:2)
看看最近发布的SYCache,它结合了NSCache和磁盘缓存。启动应用程序后立即进入内存警告状态可能是一个坏主意,但这比强制关闭要好。
就上面提到的评论者而言,映射数据是一种技术(使用mmap或其等价物)从磁盘加载数据,就好像它一次全部存储在内存中一样,这有助于UIImage在以后加载。逆(使用NSMutableData)也是如此,即文件可以直接写入RAM中。作为一种技术,它可能很有用。