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 的应用程序中:didFinishLaunchingWithOptions: 方法使我的应用程序崩溃,没有任何控制台日志等。

这似乎是一个内存问题,所以很多图像都保存在 NSArray 中,它存储在 RAM 上,直到保存 iOS 强制关闭我的应用程序。

你有什么建议吗?

干杯

4

1 回答 1

2

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

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

于 2012-04-04T17:14:01.193 回答