为什么赢了';是否在ios5上立即解除UIImagePickerController?
我有一个UITableViewController,它会弹出一个UIImagePickerController,用户拍摄一张图片,点击“使用”按钮,Picker会在处理图像时关闭以显示自定义缩略图微调器,然后在处理结束时用实际的缩略图替换微调器 至少它在iOS4中是这样工作的。现在有了iOS5,它就一直在那里处理,直到它完成,然后一切都正常工作。但是我想让旋转器在那里,这样用户就知道发生了什么,否则它看起来就像挂了一样 所以我有这个:为什么赢了';是否在ios5上立即解除UIImagePickerController?,ios5,uiimagepickercontroller,spinner,dismiss,Ios5,Uiimagepickercontroller,Spinner,Dismiss,我有一个UITableViewController,它会弹出一个UIImagePickerController,用户拍摄一张图片,点击“使用”按钮,Picker会在处理图像时关闭以显示自定义缩略图微调器,然后在处理结束时用实际的缩略图替换微调器 至少它在iOS4中是这样工作的。现在有了iOS5,它就一直在那里处理,直到它完成,然后一切都正常工作。但是我想让旋转器在那里,这样用户就知道发生了什么,否则它看起来就像挂了一样 所以我有这个: - (void) actionSheet: (UIActio
- (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:
toNO
没有意义,因为它没有被发送到另一个线程,只是按顺序运行。仅通过交换顺序,您可能会得到想要的结果,如下所示:
[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];