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

iOS7 中的 UIImagePickerController