对不起标题不清楚,但用一句话很难恢复这个问题。
我使用Facebook SDK检索用户信息。我的目的是实例化一个我自己写的名为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
。如果我在 didReceiveProfile:
之前(即在Facebook的完成处理程序中)调用代理人的sendAsynchronousRequest
方法,那么它可以正常工作并且视图正常显示,但我没有头像二进制文件。但如果我在sendAsynchronousRequest
的完成处理程序中调用它,则视图不会显示。它只是回到登录视图。
我是iOS开发的新手,但根据我的经验,似乎在不同的线程中调用了完成处理程序?异步和所有。
那么,如何让视图显示?
谢谢。
答案 0 :(得分:0)
好的,我意识到我遗漏了一些非常重要的东西。我一做到了,我也意识到问题所在。我这样叫sendAsynchronousRequest
:
var request = NSURLRequest(URL: url);
let queue = NSOperationQueue();
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ /* RESPONSE CODE */ });
显然队列不对。它应该是:
let queue = NSOperationQueue.mainQueue();
解决了它。