2016-11-26 4 views
2

Я начал реорганизовывать свои звонки Apo Alamofire, чтобы держать их в отдельном файле. Единственная проблема заключается в том, что я не знаю, как вернуть код состояния.Рефакторинг Swift alamofire пытается вернуть код состояния

Api файл:

static func getCategories(_ catId: Int, response: @escaping (JSON) ->()) { 
     let urlString = baseURL + ResourcePath.categories(catId: catId).description 
     Alamofire.request(urlString, encoding: JSONEncoding.default, headers: headers).responseJSON{ (responseData) -> Void in 

      let cCatData = JSON(responseData.result.value ?? []) 
      response(cCatData) 

     } 
    } 

Тогда в моей ВК:

Api.getCategories(catId) { (JSON) ->() in 
      self.categories = JSON["catData"] 
      self.tableView.reloadData() 
     } 

Но мне нужно знать, если код состояния 200/400/404/422/500, и я не хочу используйте функцию .validate(), я хочу передать код состояния

Обычно, если бы у меня было все в одном файле, я бы получил код состояния:

Alamofire.request("https://www.something", parameters: parameters, encoding: JSONEncoding.default, headers: headers) 
         .responseJSON() { response in 
          if let statusCode = response.response?.statusCode { 

if statusCode == 200 { 

} 

} 

ответ

1

Если вы хотите, чтобы ваше закрытие, чтобы перейти обратно код состояния, затем добавить Int? параметр и передать его обратно:

static func getCategories(_ catId: Int, response: @escaping (JSON, Int?) ->()) { 
    let urlString = baseURL + ResourcePath.categories(catId: catId).description 
    Alamofire.request(urlString, encoding: JSONEncoding.default, headers: headers).responseJSON { responseData in 
     let cCatData = JSON(responseData.result.value ?? []) 
     response(cCatData, responseData.response?.statusCode) 
    } 
} 

Или я мог бы использовать более стандартные имена переменной/параметра:

static func getCategories(_ catId: Int, completionHandler: @escaping (JSON, Int?) ->()) { 
    let urlString = baseURL + ResourcePath.categories(catId: catId).description 
    Alamofire.request(urlString, encoding: JSONEncoding.default, headers: headers).responseJSON { response in 
     let cCatData = JSON(response.result.value ?? []) 
     completionHandler(cCatData, response.response?.statusCode) 
    } 
} 

В любом случае, вы можете сделать:

Api.getCategories(catId) { json, statusCode in 
    guard statusCode == 200 else { 
     print("status code not 200! \(statusCode)") 
     return 
    } 

    // if you got here, the status code must have been 200 
} 
0

Так в основном вы хотите что-то вроде этого:

func returnStatusCode(_ urlPath: String, parameters: [String: AnyObject]? = nil, headers: [String: String]? = nil, encoding: ParameterEncoding = URLEncoding.default, completion: @escaping (_ statusCode: Int, _ responseData: [String: AnyObject]?) -> Void) { 

    // you can omit 'encoding:' if you'll set it to default since it will be default by default. \o/ 
    Alamofire.request(urlPath, method: .get, parameters: parameters, encoding: encoding, headers: headers).responseJSON { (response) in 

     if response.result.isSuccess, let returnObject = response.result.value as? [String: AnyObject], let statusCode = response.response?.statusCode { 
      // do something... 

      completion(statusCode, returnObject) 
     } 
    } 
} 

использовать функцию обратного вызова для обработки кода состояния в одиночку

+0

Так как я могу получить код состояния и данные в другом файле? – user2636197

+0

Я обновил свой пост. пожалуйста, проверьте. этот код использует swift 3.0 alamofire 4.0.1 – nferocious76

+0

ahh да хорошая точка ... но если это успех, он всегда будет падать на код 200. И если ошибка обрабатывает код ошибки, относящийся к этой ошибке. вот что я здесь сделал ... но если у вас есть предложение, я готов это услышать. (y) – nferocious76

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