UIImagePickerController在ios7中没有显示(需要更多时间来加载)相机预览

我在我的应用程序中使用GCD在后台队列中获取大量图像和数据,当我展示uiimagepickercontroller时,需要更多时间来显示相机预览。 search后,我发现很多人都面对iOS 7的这个问题,这里有一个更有意义的post。 ( iOS 7的UIImagePickerController相机没有图像 )。 解决scheme是停止后台线程,然后出现select控制器。 但我真的难住,不知道如何停止或暂停后台线程,呈现select控制器,然后恢复/启动后台线程。 有人可以帮助我这个。

下面是我如何在我的networking课堂(和其他人一样)获取图像和数据的背景。 我的串行队列是这样初始化的。

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); } }]; } } }); 

使用上面的代码,您不会在背景中执行抓取,因为dispatch_get_main_queue()会为您提供接口正在运行的队列。 要执行后台提取,您必须使用dispatch_queue_create("image_queue", NULL)打开另一个队列。

当背景获取完成,你想用UI做什么,你必须在主队列中做到这一点。

 dispatch_async(dispatch_get_main_queue(),^{ if(block) { block(user,nil) } }); 

玩完代码后,我发现了这个问题。 在所有我正在进行背景获取的地方,我都是这样发送完成块的。 当我改变主块中的完成块的返回时,它开始正常工作。 非常感谢@HackingOther指出我的错误。