视图取决于网络请求

时间:2016-04-07 08:57:09

标签: swift asynchronous ios9 ios-multithreading

为了从我的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()
    }
}

但这只是让我的应用呈现为空白屏幕。

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

提前致谢!

2 个答案:

答案 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来更新新数据。