2016-11-26 25 views
2

我已经开始重构我的Alamofire API调用,以将它们保存在单独的文件中。唯一的问题是我不知道如何返回状态码。试图返回状态代码的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) 

     } 
    } 

然后在我的VC:

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