2016-04-07 3 views
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() 
    } 
} 

Но это только делает мое приложение визуализации, как пустой экран.

По существу, мне необходимо выполнить следующие действия: Сделать сетевой запрос и получить ответ до того, как может возникнуть какой-либо рендеринг.

Спасибо заранее!

ответ

0

Я никогда не пытался переопределить loadView и не знаю, если вам нужно, но я думаю, что вам нужно сделать вызов супер в этом случае, чтобы снова отобразить ваше представление.

Редактировать

Также на ваш комментарий я поставил основной поток вызова «после» вы получите обратный звонок от 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», обратный вызов все еще происходит в фоновом потоке, который вызывает проблемы с пользовательским интерфейсом, потому что это вещество должно произойти в основном потоке. Я уточню свой ответ на то, что, как я считаю, вы хотите. Однако я бы настоятельно рекомендовал не переопределять loadView. –