很抱歉标题不够清楚,但很难在一句话中重提这个问题。
我正在使用Facebook检索用户信息。我的目的是实例化我自己编写的一个名为Profile的类,它包含多个用户信息,包括化身图片(NSData)的二进制文件。
为此,我首先使用FBRequestConnection.startWithGraphPath,然后在完成处理程序中创建一个配置文件实例,并使用NSURLConnection.sendAsynchronousRequest:queue:completionHandler:请求化身二进制数据。
一旦我得到了完整的概要文件,我就会用didReceiveProfile:通知委托。现在,委托是LoginViewController,它是UIViewController的一个子类。然后,此方法将概要文件数据保存到磁盘,然后执行以下操作:
var app: UIApplication = UIApplication.sharedApplication();
var delegate: AppDelegate = app.delegate as AppDelegate;
delegate.application(app, didReceiveProfile: profile);因此,我们的想法是通知AppDelegate,一个配置文件现在可用了,所以现在可以显示LoginViewController后面的任何视图控制器。这是它的代码:
var storyboard: UIStoryboard = UIStoryboard(name: MainStoryboardIdentifier, bundle: nil);
var profileVC: ProfileViewController! = storyboard.instantiateViewControllerWithIdentifier(ProfileViewControllerIdentifier) as ProfileViewController;
NSLog("Everything OK");
self.navigationController!.pushViewController(profileVC, animated: false);我确实得到了日志“一切正常”,但是视图没有显示出来。
更多的细节。
当应用程序第一次加载时,它会检查配置文件是否已保存到磁盘。如果有,它将从文件中加载配置文件,并调用didReceiveProfile:,后者立即跳转到第二个屏幕。因此,调用相同的方法并使其工作。不可能是密码。
另外,请注意,NSURLConnection.sendAsynchronousRequest:queue:completionHandler:是在FBRequestConnection.startWithGraphPath的完成处理程序中调用的。如果我在sendAsynchronousRequest (即Facebook的完成处理程序中)之前调用委托的didReceiveProfile:方法,那么它会正常工作,视图将被正确显示,但我没有化身二进制文件。但如果我在sendAsynchronousRequest的完成处理程序中调用它,那么视图就不会显示。它只是返回到登录视图。
我是iOS开发新手,但根据我的经验,完成处理程序似乎是在另一个线程中调用的?都是异步的。
那么,我怎样才能看到这样的景色呢?
谢谢。
发布于 2014-07-08 09:47:03
好吧,我意识到我漏掉了一些很重要的东西。我一做完,就意识到问题出在哪里。我是这样给sendAsynchronousRequest打电话的:
var request = NSURLRequest(URL: url);
let queue = NSOperationQueue();
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ /* RESPONSE CODE */ });显然排队不对。它应该是:
let queue = NSOperationQueue.mainQueue();解决了这个问题。
https://stackoverflow.com/questions/24627857
复制相似问题