2015-06-01 2 views
2

Я разрабатываю приложение iPad с использованием Swift. Для http-запросов я использую Alamofire. До сих пор мне удалось вытащить некоторые данные из API. Но проблема в том, что это асинхронный вызов, который я не знаю, как проверить, завершен ли запрос. Любая помощь будет оценена по достоинству.Как проверить запрос Alamofire завершен

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

класс Client

func getUsers(completionHandler: ([User]?, NSError?) ->()) ->(){ 

    var users: [User] = [] 
    let parameters = [ 
     "ID": "123", 
     "apikey": "1234", 
    ] 

    Alamofire.request(.GET, "API_URL", parameters: parameters).responseJSON() { 
     (_, _, JSON, error) in 
     let items = (JSON!.valueForKey("Users") as! [NSDictionary]) 
     for item in items { 
      var user: User = User() 
      user.userId = item.valueForKey("ID")! as? String 
      user.userName = item.valueForKey("Name")! as? String 
      user.group = item.valueForKey("Group")! as? String 
      users.append(user) 
     } 
     completionHandler(users, error) 
    } 

} 

Основной класс

func getUsers(){ 
    FacilityClient().getUsers() { (users, error) -> Void in 
     if users != nil { 
      self.users = users! 
     } else{ 
      println("error - \(error)") 
     } 
    } 
    tableUsers.reloadData() 
} 

Спасибо.

ответ

3

Заключительная часть Запрос Alamofire вызывается, когда запрос завершен. Я использовал свой код и прокомментирована линия, где закончил запрос еси:

Alamofire.request(.GET, "API_URL", parameters: parameters).responseJSON() { 
     (_, _, JSON, error) in 
     // 
     // The request has finished here. Check if error != nil before doing anything else here. 
     //    
     let items = (JSON!.valueForKey("Users") as! [NSDictionary]) 
     for item in items { 
      var user: User = User() 
      user.userId = item.valueForKey("ID")! as? String 
      user.userName = item.valueForKey("Name")! as? String 
      user.group = item.valueForKey("Group")! as? String 
      users.append(user) 
     } 
     // 
     // After creating the user array we will call the completionHandler, which probably reports back to a ViewController instance 
     // 
     completionHandler(users, error) 
    } 
+0

Итак, к тому времени, когда я вызываю «tableUsers.reloadData()« полностью загружены «пользователи»? – LIH

+0

Если 'getUsers()' - это метод, который вызывает запрос ** Alamofire ** в вашем вопросе, тогда да. – ezcoding

+0

Но нет. Я проверил его. Когда я устанавливаю его на таймер, он загружает таблицу. В противном случае не погрузка – LIH

2

Если вы хотите tableView перезагружать данные после того, как успешно выборки данных по сети, вам нужно будет позвонить tableUsers.reloadData() внутри этого обработчика завершения, как это:

func getUsers(){ 
    FacilityClient().getUsers() { (users, error) -> Void in 
     if users != nil { 
      self.users = users! 
      tableUsers.reloadData() // SHOULD be here 
     } else{ 
      println("error - \(error)") 
     } 
    } 
    // tableUsers.reloadData() // WAS here 
} 

И Alamofire убедитесь, что обработчик завершения вызывается основной очереди, если вы не укажете очереди. Вам не нужно добавлять код, чтобы он снова вызывался на mainThread.

И на ваш первоначальный вопрос: единственный способ, которым Alamofire дал вам знать, что запрос завершен, - это вызов этого обработчика завершения, который вы передаете методу Alamofire.request.

Смежные вопросы