我最近一直在开发音乐播放器,我正在编写自己的选择器。我正在尝试将我的代码测试到极限,所以我的 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 强制关闭我的应用程序。
你有什么建议吗?
干杯