0
- (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も画面に残り、コントロールをタップしようとすると応答します。

何もしなければ消えるのに時間がかかります。

これをきびきびとやりたいのですが、コードで何が間違っていますか?

4

2 に答える 2

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];
        });
    });
}
于 2013-06-18T05:54:15.963 に答える