2016-01-13 1 views
0

В настоящее время я пытаюсь вложить запросы Alamofire в использование данных, которые я уже получил с использованием запросов GET.Обратные вызовы вложенности Alamofire или возвращаемое значение для глобального использования

Для этого кусок кода, который я использовал ответ Роба в этом вопросе

How to return value from Alamofire

Однако, я не могу ни гнезда запросов Alamofire или использовать их по отдельности.

Это то, что я пытаюсь сделать

override func viewDidLoad() { 
    super.viewDidLoad() 


    var currentFoodType: String = "" 
    var currentFoodList: String = "" 

    //debug 

    //this is how I get back the token from NSUserDefault 
    if let myToken = userDefaults.valueForKey("token"){ 


     // calling method to get the user info 
     getUserInfo(myToken as! String) 

     // calling method to get the product type 
     func getFoodCategory(completionHandler: (NSDictionary?, NSError?) ->()) { 
      getProductTypes(myToken as! String, completionHandler: completionHandler) 
     } 
     getFoodCategory() { responseObject, error in 
      // use responseObject and error here 

      let foodTypesJSON = JSON(responseObject!) 
      //to get one single food category 
      currentFoodType = (foodTypesJSON["types"][0].stringValue) 
      print(currentFoodType) 


      ///////////////////////////////////////// 
      func getFoodsByCategory(completionHandler: (NSDictionary?, NSError?) ->()) { 
       print("getting " + currentFoodType) 
       self.getProductsByType(myToken as! String, productType: currentFoodType, completionHandler: completionHandler) 
      } 

      getFoodsByCategory() { responseObject, error in 
       // use responseObject and error here 
       print("responseObject = \(responseObject); error = \(error)") 

       return 
      } 

      return 
     } 

    } 

Затем две других функций, я звоню оттуда очень прямой Alamofire запросы с обратными вызовами к completionHandlers выше

//GET THE PRODUCT TYPES FROM THE SERVER 
func getProductTypes(myToken: String, completionHandler: (NSDictionary?, NSError?) ->()) { 

    let requestToken = "Bearer " + myToken 
    let headers = ["Authorization": requestToken] 
    let getProductTypesEndpoint: String = BASE_URL + PRODUCT_TYPES 


    Alamofire.request(.GET, getProductTypesEndpoint, headers: headers) 
     .responseJSON{ response in 
      switch response.result { 
      case .Success(let value): 
       completionHandler(value as? NSDictionary, nil) 
      case .Failure(let error): 
       completionHandler(nil, error) 
      } 
    }//END ALAMOFIRE GET responseJSON 


} 

выше функция возвращает единичную пищу, такую ​​как «Десерты», которая будет использоваться в следующей функции для получения всех десертов с сервера

//GET THE PRODUCTS FROM THE SERVER GIVEN A CATEGORY 
func getProductsByType(myToken: String, productType: String, completionHandler: (NSDictionary?, NSError?) ->()){ 

    let requestToken = "Bearer " + myToken 
    let headers = ["Authorization": requestToken] 
    let getProductTypesEndpoint: String = BASE_URL + PRODUCT_BY_TYPE + productType 

    Alamofire.request(.GET, getProductTypesEndpoint, headers: headers) 
     .responseJSON { response in 
      switch response.result { 
      case .Success(let value): 
       print("no errors") 
       let auth = JSON(value) 
       print("The pbt GET description is: " + auth.description) 
       completionHandler(value as? NSDictionary, nil) 
      case .Failure(let error): 
       print("there was an error") 

       completionHandler(nil, error) 
      } 
    }//END ALAMOFIRE GET responseJSON 
} 

и это хорошо работает, потому что когда я печатаю внутри функции getProductsByType

с использованием

print("The pbt GET description is: " + auth.description) 

Я получаю JSON со всеми продуктами , но проблема заключается в функции viewDidload где я вложенности обратные вызовы

getFoodsByCategory() { responseObject, error in 
       // use responseObject and error here 
       print("responseObject = \(responseObject); error = \(error)")     
       return 
      } 

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

Потому что я получаю

responseObject = nil; error = nil 

Так что я думаю, что там должен быть другой способ, чтобы гнездиться эти обратные вызовы?

ответ

0

Взгляните на прикованные обещания от PromiseKit. Это также хорошо работает с Alamofire:

func loadFoo() -> Promise<Bar> { 
    return Promise<Bar> { fulfill, reject in 
     Alamofire.request(.GET, "url") 
     .responseJSON { response in 
      switch response.result { 
       case .Success(let value): 
        let bar = Bar(fromJSON: value) 
        fulfill(bar) 
       case .Failure(let error): 
        reject(error) 
      } 
     } 
    } 
} 


// Usage  
getBar() 
.then { bar -> Void in 
    // do something with bar 
} 
.error { error in 
    // show error 
} 

Это очень простой пример, но вы можете найти более соответствующие примеры в документации.

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

  • Нет связанных вопросов^_^