Swift 视图依赖于网络请求

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

为了从视图控制器完全渲染视图,我需要网络请求的响应

我一直试图用很多不同的方法来做这件事,但每次都不成功

最初,我是通过在调用任何方法渲染视图之前发出“同步”网络请求来实现的。但是,编译器警告我,从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()
    }
}
但这只会使我的应用程序呈现为一个空白屏幕

基本上,我需要完成的是: 在进行任何视图渲染之前,发出网络请求并接收响应


提前谢谢

我从来没有真正尝试过覆盖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。