0

为了从我的视图控制器完全呈现我的视图,我需要从网络请求中获得响应。

我一直在尝试以多种不同的方式做到这一点,但每次都没有成功。

最初,我通过在调用任何方法来呈现视图之前发出“同步”网络请求来使其工作。但是,编译器警告我,从 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()
    }
}

但这只会使我的应用程序呈现为空白屏幕。

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

提前致谢!

4

2 回答 2

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()
    }
}

希望这会有所帮助。

于 2016-04-07T13:14:26.667 回答
-1

视图控制器应该在viewDidLoador中处理所有这些网络逻辑viewWillAppear,而不是在loadView. 我建议在子视图上将加载状态设置为初始空状态,然后一旦您拥有所需的内容,就使用该数据更新视图。您可能需要调用setNeedsLayout视图来更新新数据。

于 2018-10-09T02:34:59.490 回答