2016-04-07 71 views
0

为了从View Controller完全呈现我的视图,我需要从网络请求获得响应。查看取决于网络请求

我一直在尝试这么做的方式很多,但每次都不成功。

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

我从来没有真正尝试覆盖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() 
    } 
} 

希望有帮助。

+0

有没有办法让我无法在主线程上执行网络请求? – luckybroman5

+0

其实我认为你是在后台线程上做这件事。我认为NSURLSession在默认情况下是异步的,即使你将其包装在“dispatch_get_main_queue”中,回调仍然发生在后台线程上,因为这些东西需要在主线程上发生,所以会导致UI问题。我会更新我的答案,我相信你想要的。不过,我会强烈建议不要重写loadView。 –