很抱歉标题不清晰,但很难用一句话来恢复问题。
我正在使用 Facebook SDK 来检索用户信息。我的目的是实例化我自己编写的一个名为 Profile 的类,其中包含多个用户信息,包括头像图片的二进制文件 ( NSData
(。
为此,我首先使用 FBRequestConnection.startWithGraphPath
,然后在完成处理程序中,我创建一个 Profile 实例并使用 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
之前调用委托的didReceiveProfile:
方法(即在 Facebook 的完成处理程序中(,那么它可以工作并且视图正确显示,但我没有头像二进制文件。但是如果我在 sendAsynchronousRequest
的完成处理程序中调用它,则视图不会显示。它只是回到登录视图。
我是iOS开发的新手,但根据我的经验,似乎在不同的线程中调用了完成处理程序?异步和所有。
那么,如何显示视图呢?
谢谢。
好吧,我意识到我遗漏了一些非常重要的东西。当我这样做时,我也意识到问题是什么。我是这样打电话给sendAsynchronousRequest
的:
var request = NSURLRequest(URL: url);
let queue = NSOperationQueue();
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ /* RESPONSE CODE */ });
显然队列不对。它应该是:
let queue = NSOperationQueue.mainQueue();
这就解决了。