需要有关dispatch_sync和dispatch_async的帮助

时间:2013-06-18 05:50:02

标签: ios objective-c grand-central-dispatch

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

    [self dismissViewControllerAnimated:YES completion:^{}];

    [self.navigationController.tabBarController.view addSubview:self.waitingView];

    dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(currentQueue, ^{

        self.originalImgFromPicker = [info objectForKey:UIImagePickerControllerOriginalImage];

        CGSize size = self.originalImgFromPicker.size;
        if (size.width > 320)
        {
            size.height /= (size.width / 320);
            size.width = 320;
        }

        UIGraphicsBeginImageContext(size);
        [self.originalImgFromPicker drawInRect:CGRectMake(0,0,size.width,size.height)];
        self.resizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        self.originalImgFromPicker = nil;

        NSData *resizedImageBinary = UIImageJPEGRepresentation(self.resizedImage, 1.0);

        self.resizedImageBinaryString = [NSString base64StringFromData:resizedImageBinary length:resizedImageBinary.length];

        dispatch_sync(currentQueue, ^{
            [self.waitingView removeFromSuperview];
        });
    });
}

我正在处理图像,在此期间我使用带有活动指示符的透明视图来阻止UI。

但是这个self.waitingView消失需要很长时间才能完成。

当图像处理正在进行时,UI实际上会被self.waitingView阻止,这意味着当我尝试点击无效后的控件但是当异步块中的图像处理完成时self.waitingView仍然保留在屏幕上当我尝试点击任何控件时它会响应。

如果我什么都不做,那就需要一些时间才能消失。

我想以犀利的方式做到这一点,我在代码中做错了什么?

2 个答案:

答案 0 :(得分:2)

UI操作应该在主队列中完成

更改代码

         dispatch_sync(currentQueue, ^{
            [self.waitingView removeFromSuperview];
        });

        dispatch_sync(dispatch_get_main_queue(), ^{
            [self.waitingView removeFromSuperview];
        });

所以你的方法看起来像

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

    [self dismissViewControllerAnimated:YES completion:^{}];

    [self.navigationController.tabBarController.view addSubview:self.waitingView];

    dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(currentQueue, ^{

        self.originalImgFromPicker = [info objectForKey:UIImagePickerControllerOriginalImage];

        CGSize size = self.originalImgFromPicker.size;
        if (size.width > 320)
        {
            size.height /= (size.width / 320);
            size.width = 320;
        }

        UIGraphicsBeginImageContext(size);
        [self.originalImgFromPicker drawInRect:CGRectMake(0,0,size.width,size.height)];
        self.resizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        self.originalImgFromPicker = nil;

        NSData *resizedImageBinary = UIImageJPEGRepresentation(self.resizedImage, 1.0);

        self.resizedImageBinaryString = [NSString base64StringFromData:resizedImageBinary length:resizedImageBinary.length];

        dispatch_sync(dispatch_get_main_queue(), ^{
            [self.waitingView removeFromSuperview];
        });
    });
}

答案 1 :(得分:0)

替换

dispatch_sync(currentQueue, ^{
        [self.waitingView removeFromSuperview];
    });

dispatch_async(dispatch_get_main_queue(), ^{
        [self.waitingView removeFromSuperview];
    });