ALAssetsLibrary线程是否安全(使用多个线程时发生死锁)

时间:2013-09-12 09:57:56

标签: ios multithreading alassetslibrary alasset assetslibrary

我目前正在开发一个小项目,可以将所有图库照片加载到我的应用程序中以显示一些奇特的效果。不幸的是,系统提供的这些默认缩略图不能满足我的要求。所以我尝试使用“fullScreenImage”创建自己的缩略图。为了加快进程,我使用后台操作加载fullScreenImage。主要方法是:

- (void)getFullScreenImage:(NSURL *)url success:(void(^)(UIImage *))callback
{
   NSLog(@"Requesting %@", url);
    [assetsLibraryInstance assetForURL:url resultBlock:^(ALAsset *asset) {
        callback(asset.defaultRepresentation.fullScreenImage);
    }
    failureBlock:nil];
}

- (void)processURLs:(NSArray *)urls
{
    for (NSURL *url in urls) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) ^{
             [self getFullScreenImage:url success:^(UIImage *img) {
                  NSLog(@"Got image %@", img);
             }] ;
        });
    }
}

在控制台中只打印“Requesting ...”日志,“getFullScreenImage”方法被锁定,没有任何输出。

我尝试了以下方法来解决此问题:

  1. 不共享assetsLibraryInstance(无效)
  2. 在“processURLs”中枚举网址时不要发送dispatch_async。 (干预了,但我不想使用signle线程处理所有网址)
  3. 不使用全局队列,使用主队列(已完成工作,但所有这些“fullScreenImage”工作正在UI线程上进行,使UI无响应)
  4. 使用使用“dispatch_queue_create”创建的专用队列。 (没用)
  5. 那么,ALAssetsLibrary线程安全吗?我想这不是......或者,有什么更好的方法可以用来:

    1. 在后台加载fullScreenImage
    2. 多线程
    3. 谢谢!

0 个答案:

没有答案