为什么赢了';是否在ios5上立即解除UIImagePickerController?

为什么赢了';是否在ios5上立即解除UIImagePickerController?,ios5,uiimagepickercontroller,spinner,dismiss,Ios5,Uiimagepickercontroller,Spinner,Dismiss,我有一个UITableViewController,它会弹出一个UIImagePickerController,用户拍摄一张图片,点击“使用”按钮,Picker会在处理图像时关闭以显示自定义缩略图微调器,然后在处理结束时用实际的缩略图替换微调器 至少它在iOS4中是这样工作的。现在有了iOS5,它就一直在那里处理,直到它完成,然后一切都正常工作。但是我想让旋转器在那里,这样用户就知道发生了什么,否则它看起来就像挂了一样 所以我有这个: - (void) actionSheet: (UIActio

我有一个UITableViewController,它会弹出一个UIImagePickerController,用户拍摄一张图片,点击“使用”按钮,Picker会在处理图像时关闭以显示自定义缩略图微调器,然后在处理结束时用实际的缩略图替换微调器

至少它在iOS4中是这样工作的。现在有了iOS5,它就一直在那里处理,直到它完成,然后一切都正常工作。但是我想让旋转器在那里,这样用户就知道发生了什么,否则它看起来就像挂了一样

所以我有这个:

- (void) actionSheet: (UIActionSheet *)actionSheet didDismissWithButtonIndex (NSInteger)buttonIndex {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = NO;
    // yada, yada, yada
    [self presentModalViewController:picker animated:YES];
    [picker release];
}
然后,当用户选择“使用”时,就会调用该函数:

然后调用它在缩略图旋转时执行处理:

- (void) processImage:(NSDictionary *)info
{
    UIImage *image = nil;
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    // processing of image
    animate = false;
    [activityImageView stopAnimating];
    [activityImageView release];
    [self.tableView reloadData];
}

就像我说的,它在iOS4上运行得很好,但是在iOS5上,没有这样的运气。那怎么办?图像选择器最终会被解除,那么为什么不立即解除呢?

我不确定在这一点上,
iOS4
iOS5
之间为什么存在差异。但是您对UI挂起的描述与您展示的代码相当一致。主线程上的执行选择器就是这样做的,在主线程上执行选择器,而主线程就是您调用的线程。由于此设置,
waituntldone:
to
NO
没有意义,因为它没有被发送到另一个线程,只是按顺序运行。仅通过交换顺序,您可能会得到想要的结果,如下所示:

[self dismissModalViewControllerAnimated:YES];
animate = true;
[self performSelectorOnMainThread:@selector(processImage:) withObject:info waitUntilDone:NO];
但请注意,这充其量是有风险的,因为我假设图像的处理不包含并发性。我更喜欢并发块。除此之外,我喜欢嵌套块,以使并发性易于遵循,例如:

-(void)doSomeStuffInBackground{
    // Prepare for background stuff
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // Do background stuff
        dispatch_async(dispatch_get_main_queue(), ^{
            // Update UI from results of background stuff
        });
    });
}
因此,考虑到这一点,我建议采取类似的措施:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [self dismissModalViewControllerAnimated:YES];
    [self processImage:info];
}

-(void)processImage:(NSDictionary *)info{
    animate = true;
    UIImage *image = nil;
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // processing of image here on background thread

        dispatch_async(dispatch_get_main_queue(), ^{
            // update UI here on main thread
            animate = false;
            [activityImageView stopAnimating];
            [activityImageView release];
            [self.tableView reloadData];
        });
    });
}
这将把主要工作转移到后台线程,让UI保持响应性。

尝试使用

[[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 
而不是:

[[picker parentViewController] dismissModalViewControllerAnimated: YES];

我真的不知道这有什么关系,但您是否尝试过将
[self-performSelector…
替换为
dispatch\u async(dispatch\u get\u main\u queue(),^{[self-processImage:info];})好主意,但同样的行为。但至少我学到了一些新东西!太好了!这正是我想要的,我也学到了一些东西。事实上,我现在记得在我上的一节课上学过类似的东西,但我想我并不喜欢。谢谢!欢迎使用堆栈溢出!谢谢你的帖子!请不要使用签名您的用户框将作为您的签名,您可以使用您的个人资料发布您喜欢的任何关于您自己的信息。
[[picker parentViewController] dismissModalViewControllerAnimated: YES];