NSURLConnection.sendAsynchronousRequest问题

时间:2014-07-08 09:07:51

标签: ios swift nsurlconnection nsurlrequest facebook-sdk-3.1

对不起标题不清楚,但用一句话很难恢复这个问题。

我使用Facebook SDK检索用户信息。我的目的是实例化一个我自己写的名为Profile的类,它包含几个用户信息,包括头像图片​​的二进制文件(NSData)。

为此,我首先使用FBRequestConnection.startWithGraphPath,然后在完成处理程序中,使用NSURLConnection.sendAsynchronousRequest:queue:completionHandler:

创建一个Profile实例并请求头像二进制数据

我收到完整的个人资料后,立即通过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开发的新手,但根据我的经验,似乎在不同的线程中调用了完成处理程序?异步和所有。

那么,如何让视图显示?

谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我意识到我遗漏了一些非常重要的东西。我一做到了,我也意识到问题所在。我这样叫sendAsynchronousRequest

var request = NSURLRequest(URL: url);
let queue = NSOperationQueue();
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ /* RESPONSE CODE */ });

显然队列不对。它应该是:

let queue = NSOperationQueue.mainQueue();

解决了它。