2015-12-03 3 views
-1

я перетащить SEGUE из желтой части контроллера вида на другой контроллер представления, и желтой части я имею в виду следующее: enter image description hereпочему переход не стреляя в этом контексте

тогда я сделать сетевой вызов к серверу, я обрабатывать ответ, то я хочу, чтобы огонь SEGUE, я это сделать:

let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
      // bla bla here 

self.performSegueWithIdentifier(SegueIdentifier.receivedResponse.rawValue, sender: self) 
       }catch { 

       } 
      } 
     }) 
     task.resume() 

, как вы видите, я звоню perform segue

тогда я добавить prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let identifier = segue.identifier 
     if let identifier = identifier { 
      switch identifier { 
      case SegueIdentifier.receivedResponse.rawValue: 
       let destination = segue.destinationViewController as! ResponsesTableViewController 
       destination.responses = self.responses 
       break; 
      default: 
       break; 
      } 
     } 
    } 

я поставил точку останова, не все линии внутри всех путей prepareForSegue до перерыва, все выполняется, но второй контроллер представления не показал

+0

Что находится в вашем блоке блокировки? Если ваш код выбрасывает, то executeSegue никогда не будет выполнен. И вы должны переключиться на главную очередь для выполнения функции. – Ian

+0

Ваш сеанс настроен на использование очереди делегатов? – matt

+0

@lan не существует excpetoni, потому что, как я сказал u, готовый FORSegue выполняется – sarah

ответ

2

Обработчика завершения будет работать на фоновая очередь. Операции пользовательского интерфейса должны выполняться в основной очереди. Таким образом, в вашем завершении закрытия обработчика используйте:

dispatch_async(dispatch_get_main_queue(), { 
    self.performSegueWithIdentifier(SegueIdentifier.receivedResponse.rawValue, sender: self) 
}) 
+0

поэтому каждый раз, когда я вызываю calouser, он будет в этой очереди? или просто в session.data с функцией задачи? также я вижу, что есть фоновая очередь, и вы сказали основную очередь, есть ли другие очереди? – sarah

+0

Многие обработчики завершения вызываются в фоновых очередях, но не всегда. Например, среда Parse.com отправляет обработчики завершения в основной очереди для вас. Существует несколько очередей по умолчанию, и вы можете создавать свои собственные. См. Https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html – Paulw11

+0

Правильно, это то, к чему я тоже обращался с моим комментарием. – matt