UIImagePickerController 未在 ios7 中显示(需要更多时间来加载)相机预览
Posted
技术标签:
【中文标题】UIImagePickerController 未在 ios7 中显示(需要更多时间来加载)相机预览【英文标题】:UIImagePickerController not showing (taking more time to load) camera preview in ios7 【发布时间】:2014-04-18 15:09:59 【问题描述】:我在我的应用程序中使用 GCD 来获取后台队列中的大量图像和数据,当我展示 uiimagepickercontroller 时,需要更多时间来显示相机预览。谷歌搜索后,我发现很多人在使用 ios 7 时都遇到过这个问题,这里还有一篇对我有意义的帖子。 (iOS 7 UIImagePickerController Camera No Image)。解决方案是停止后台线程,然后显示选取器控制器。但我真的很难过,不知道如何停止或暂停后台线程,呈现选择器控制器,然后恢复/启动后台线程。有人可以帮我解决这个问题吗?
这是我在网络课程中(与其他人一样)进行背景图像和数据获取的方式。我的串行队列是这样初始化的。
sharedInstance.serialQueue = dispatch_queue_create("user-detail-queue", DISPATCH_QUEUE_CONCURRENT);
而后台取东西的代码是这样的。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
NSString *myUserID = [JNKeychain loadValueForKey:@"userID"];
NSString *sessionToken = [JNKeychain loadValueForKey:@"sessionToken"];
if(sessionToken && myUserID)
dispatch_async([BGNetworkAPI sharedInstance].serialQueue, ^
id object = [[BGNetworkAPI sharedInstance].userCache objectForKey:myUserID];
if(object)
NSDictionary *cachedResponseDictionary = (NSDictionary *)object;
BGUser *user = [BGUser createUserWithResponseDictionary:cachedResponseDictionary];
if(block)
block(user, nil);
else
[[BGUserManagementClient sharedClient] fetchUserDetailsWithUserId:myUserID withSessionToken:sessionToken withSuccessBlock:^(AFHTTPRequestOperation *operation, id responseObject)
//NSLog(@"The response object of my user object is %@",responseObject);
[[BGNetworkAPI sharedInstance].userCache setObject:responseObject forKey:myUserID];
NSDictionary *responseDictionary = (NSDictionary *)responseObject;
BGUser *user = [BGUser createUserWithResponseDictionary:responseDictionary];
if(block)
block(user,nil);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"The error while fetching the user details is %@", operation.responseObject);
if(block)
block(nil, error);
];
);
【问题讨论】:
我最近在我的应用程序中使用了UIImagePickerController
,并且在后台线程中没有做任何事情。然而,图像选择器仍然需要很长时间才能加载,但只是第一次加载。
【参考方案1】:
使用上面的代码,您不会在后台进行提取,因为dispatch_get_main_queue()
为您提供了接口正在运行的队列。要执行后台提取,您必须使用 dispatch_queue_create("image_queue", NULL)
打开另一个队列。
当背景提取完成并且您想对 UI 执行某些操作时,您必须在主队列中执行此操作。
dispatch_async(dispatch_get_main_queue(),^
if(block)
block(user,nil)
);
【讨论】:
现在可以用吗?如果不是,问题可能是[BGNetworkAPI sharedInstance].serialQueue
的第二次调度
您指向 dispatch_get_main_queue() 的指针解决了我的问题。非常感谢!我必须将所有完成块发送到主队列,这样我就有了主队列句柄,当我现在展示图像控制器时,它可以正常工作。
所以我返回 if(block)block(user,nil) 的代码,我把它放在 dispatch_async(dispatch_get_main_queue(),if(block)block(user ,nil));【参考方案2】:
在玩弄了代码之后,我发现了问题所在。在我进行后台提取的所有地方,我都像这样发送完成块。当我在主块中更改完成块的返回时,它开始正常工作。非常感谢@HackingOther 指出我的错误。
【讨论】:
以上是关于UIImagePickerController 未在 ios7 中显示(需要更多时间来加载)相机预览的主要内容,如果未能解决你的问题,请参考以下文章
UIImagePickerController 委托未调用 Swift 3
iPad 问题中未显示 UIImagePickerController
UIImagePickerController 相机未将照片保存在照片库中
Swift UIImagePickerController didFinishPickingMediaWithInfo 未触发
从库中选择视频时未调用 uiimagepickercontroller didfinishpickingmediawithinfo