为了从我的View Controller中完全呈现我的View,我需要从网络请求中获得响应。
我一直在努力做到这一点有很多不同的方法,但每次都没有成功。
最初,我在调用任何渲染View的方法之前通过发出“同步”网络请求让它工作。但是,编译器警告我,自ios 8起不推荐同步网络请求。
以最高效的方式实现这一目标的最佳方法是什么?
我试过了:
override func loadView() {
dispatch_sync(dispatch_get_main_queue()){
// GET the Markup
let url = NSURL(string: self.PageURL)
let request = NSURLRequest(URL: url!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let RequiredViewData = session.dataTaskWithRequest(request) {(data, response, error) in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
self.RequiredViewJSON = json
self.view = UIView(frame: UIScreen.mainScreen().bounds)
print(data)
} catch {
print("error serializing JSON: \(error)")
}
}
RequiredViewData.resume()
}
}
但这只是让我的应用呈现为空白屏幕。
基本上我需要完成的是: 发出网络请求并在任何视图呈现发生之前接收响应。
提前致谢!
答案 0 :(得分:0)
我从未真正尝试覆盖loadView,也不知道你是否应该这样做,但我认为你需要做的就是在这种情况下调用super来让你的视图再次渲染。
修改
同样根据你的评论我把主线程调用""你从NSURLSession得到回电。我可能有一个错误的地方,但应该让你足够近。
override func loadView() {
// GET the Markup
let url = NSURL(string: self.PageURL)
let request = NSURLRequest(URL: url!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let RequiredViewData = session.dataTaskWithRequest(request) {(data, response, error) in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
self.RequiredViewJSON = json
dispatch_sync(dispatch_get_main_queue()){
//You may also want to try commenting this out unless you are intentionally creating a blank view.
self.view = UIView(frame: UIScreen.mainScreen().bounds)
print(data)
//call super after you get what you need
super.loadView()
}
} catch {
print("error serializing JSON: \(error)")
}
}
RequiredViewData.resume()
}
}
希望这有帮助。
答案 1 :(得分:-1)
您提出的建议似乎不符合MVC
的原则。视图控制器应该处理所有这些逻辑。您应该在此视图的初始化时设置加载状态,一旦拥有所需的内容,就使用该数据更新视图。如果需要,视图控制器可以隐藏您的视图,直到可以对其进行更新为止。您可能需要在视图上调用setNeedsLayout
来更新新数据。