从异步块向主线程发送参数时遇到问题

Posted

技术标签:

【中文标题】从异步块向主线程发送参数时遇到问题【英文标题】:Trouble Sending Parameter to Main Thread From Async Block 【发布时间】:2013-01-03 05:56:56 【问题描述】:

我有以下方法在拍摄照片后从UIImagePicker 检索ALAsset。然后它尝试通过主线程将此ALAsset 发送到我的另一个方法:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    NSURL *imageURL = [[info valueForKey:UIImagePickerControllerReferenceURL] retain];
    __block ALAsset *result;

    [self.assetsLibrary assetForURL:imageURL resultBlock:^(ALAsset *asset)
    
        result = [asset retain];

        dispatch_async(dispatch_get_main_queue(), ^
        
            [self loadPhotoImageViewWithAsset:result];
            [self dismissModalViewControllerAnimated:YES];
            [imageURL release];
            [result release];
        );
    
    failureBlock:^(NSError *error)
    

    ];

当我进入dispatch_async(dispatch_get_main_queue(), ^ block 时,result 显示为nil。有人知道我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

请参考UIImagePickerController to use for a UIImageView,结果显示为 nil。

这样使用:

 [self.assetsLibrary assetForURL:imageURL resultBlock:^(ALAsset *asset)

    result = [asset retain];
    [self loadPhotoImageViewWithAsset:result];
    [self dismissModalViewControllerAnimated:YES];
    [imageURL release];
    [result release];   

failureBlock:^(NSError *error)


];

更改您的loadPhotoImageViewWithAsset 方法

-(void)loadPhotoImageViewWithAsset:(ALAsset *)asset

  //dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
   //dispatch_async(queue, ^
    dispatch_async(dispatch_get_main_queue(), ^
    
     //here code for loading image
    );
  // );

【讨论】:

感谢这在我使用 UIImagePicker 从照片库中选择照片时有效。当我尝试将它与相机一起使用时,它没有,所以我想问题更多的是相机。 UIImagePickerControllerReferenceURL 有一个用于挑选照片和拍摄照片的 url。所以代码保持不变 问题是使用 imagepicker 拍摄的照片由于某种原因没有进入我的照片库。将您的标记为正确,因为您回答了我的问题,谢谢。

以上是关于从异步块向主线程发送参数时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

向主线程指示日历访问的异步调用已完成

线程异步并发处理邮件发送

遇到多线程问题同时连接到多个设备

在 Java 中使用异步线程编辑文件

我在设置 Ros 主从时遇到问题

异步数据处理Handler