Swift 视图依赖于网络请求
为了从视图控制器完全渲染视图,我需要网络请求的响应 我一直试图用很多不同的方法来做这件事,但每次都不成功 最初,我是通过在调用任何方法渲染视图之前发出“同步”网络请求来实现的。但是,编译器警告我,从ios 8开始,同步网络请求已被弃用 以最有效的方式实现这一目标的最佳方式是什么 我试过:Swift 视图依赖于网络请求,swift,asynchronous,ios9,ios-multithreading,Swift,Asynchronous,Ios9,Ios Multithreading,为了从视图控制器完全渲染视图,我需要网络请求的响应 我一直试图用很多不同的方法来做这件事,但每次都不成功 最初,我是通过在调用任何方法渲染视图之前发出“同步”网络请求来实现的。但是,编译器警告我,从ios 8开始,同步网络请求已被弃用 以最有效的方式实现这一目标的最佳方式是什么 我试过: override func loadView() { dispatch_sync(dispatch_get_main_queue()){ // GET the Markup
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()
}
}
但这只会使我的应用程序呈现为一个空白屏幕
基本上,我需要完成的是:
在进行任何视图渲染之前,发出网络请求并接收响应
提前谢谢 我从来没有真正尝试过覆盖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()
}
}
希望这会有所帮助。视图控制器应该在
viewdiload
或viewwillbeen
中处理所有这些网络逻辑,而不是在loadView
中。我建议将加载状态设置为子视图的初始空状态,然后在获得所需内容后,使用该数据更新视图。您可能需要在视图上调用setNeedsLayout
,以更新新数据。是否有一种方法使我无法在主线程上执行网络请求?实际上,我认为您无论如何都是在后台线程上执行此操作。我认为NSURLSession在默认情况下是异步的,即使您将其包装在“dispatch_get_main_queue”中,回调仍会发生在后台线程上,这会导致UI问题,因为这些事情需要在主线程上发生。我将更新我的答案,以满足您的需求。但是,我强烈建议不要覆盖loadView。