Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 缓存数千张图像_Objective C_Buffer_Cpu_Ram_Mpmediaitem - Fatal编程技术网

Objective c 缓存数千张图像

Objective c 缓存数千张图像,objective-c,buffer,cpu,ram,mpmediaitem,Objective C,Buffer,Cpu,Ram,Mpmediaitem,我最近一直在开发一款音乐播放器,我正在编写自己的选择器。 我正试图测试我的代码,以达到它的极限,所以我的iPhone里有大约1600张专辑 我将AQGridView用于albums view,由于MPMediaItemArtwork是NSObject的一个子类,因此需要在其上启动一个方法以从中获取图像,并且该方法可以缩放图像 正如您所能猜到的,每个单元的扩展都会占用太多的CPU,因此我的网格相册视图很落后,尽管我尽了所有努力手动驱动每个单元的包含 所以我想在应用程序启动时开始使用GCD进行扩展,

我最近一直在开发一款音乐播放器,我正在编写自己的选择器。 我正试图测试我的代码,以达到它的极限,所以我的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的内存映射。你能稍微打开一下吗?