【问题标题】:Api Calling in Swift with Alamofire?使用 Alamofire 在 Swift 中调用 API?
【发布时间】:2017-12-24 21:35:22
【问题描述】:

下面是我用于 API 调用的代码,这里有任何其他方法可以减少所有视图控制器的代码。我可以创建一个 alamofire API 调用的模型类吗?

 func ForgotPasswordServiceCall()  {
    
    
    let params = [
        "email":EmailTextField.text!,
        ]
    
    let strUrl = "forgotPassword?"
    
    PKHUD.sharedHUD.contentView = PKHUDProgressView()
    PKHUD.sharedHUD.show()
    
    Alamofire.request(strUrl, method: .post, parameters: params, encoding: URLEncoding.httpBody)
        .responseJSON{ response in
            
            PKHUD.sharedHUD.hide()
            if((response.result.value) != nil)
            {
                let swiftyJsonVar = JSON(response.result.value!)
                
                if let resData = swiftyJsonVar.dictionaryObject
                {
                    
                    if(resData["status"] as! String == "success")
                    {
                      //self.arrData = resData["result"] as! [[String:String]]
                      //self.arrData = resData["result"] as! [NSDictionary]
                     //cel.text=self.arrData[indexPath.row].object(forKey:""] 
                     //as! NSString)as String 
                    }else{
                    }
                }
            }
            else
            {
            }
    }
}

【问题讨论】:

  • “减少代码”是什么意思?
  • 我不认为你可以让它更小,但如果你要从不同的视图控制器调用它,你可以创建一个调用的结构单例并为函数创建一个完成处理程序,然后从其他视图控制器调用它。

标签: ios swift api


【解决方案1】:

您肯定可以为所有视图控制器减少代码 -

  1. 创建一个处理所有 REST API 请求(GET、POST、PUT 等)的基类。
  2. 为 JSON 对象创建模型类。

让我给你一个例子 -

基类 -

class WebServiceHandler : NSObject {


override init() {
    // perform some initialization here

}


func processSingleRecord() -> Bool {
    return false
}

func getWebServiceUrl() -> String{
    return ""
}
func DisplayNetworkAvailabilityMessage()-> String{
    return "network failed"
}

func fetchDataFromWebServicePost<T: Mappable>(_ parameters: Dictionary<String , AnyObject>, closure:@escaping (_ response: T) -> Void) {

    let url = getWebServiceUrl()
     Alamofire.request(url, method: .post, parameters: parameters, headers: nil).responseJSON { (response:DataResponse<Any>) in
            print(response.request)  // original URL request
            print(response.response) // URL response
            //                print(response.data)     // server data
            print("Result",response.result)   // result of response serialization
            print("parameters = \(parameters)")
            if let JSON = response.result.value {
                print("JSON: \(JSON)")
            }
            SVProgressHUD.dismiss()
            switch response.result {
            case .success(_):
                if response.response?.statusCode == 200 || response.response?.statusCode == 201 {
                    var user = Mapper<T>().map(JSONObject: response.result.value)
                    if self.processSingleRecord() == true {
                        user = Mapper<T>().map(JSONObject: (response.result.value as! NSArray).object(at: 0))
                    }
                    closure(user! )
                }
                else if response.response?.statusCode == 0{

                }
                else  {
                    if let _ = response.result.value as? Error {
                    }
                }
            case .failure(let error):
                debugPrint("getEvents error: \(error)")
                SVProgressHUD.dismiss()
            }
        }.responseString { response in
            //                print("Success: \(response.result.isSuccess)")
            //                print("Response String: \(response.result.value)")
    }
} }

单个 api 的模型类 -

    class DeviceTokenDataHandler : WebServiceHandler
  {

    override func getWebServiceUrl() -> String{
        return ApiLinks.sharedInstance.deviceTokenLink()
    }

    override func DisplayNetworkAvailabilityMessage()-> String{
        return "Check your internet connection"
    }    

}

定义所有 api 链接的 ApiLinks 类 -

import Foundation
class ApiLinks : NSObject {

    var prod = Bool()
    var dev = Bool()
    var httpPart = "http://"

    var localHost = "put your base url here"
    var prodHost = "put your base url here"


    var apiExtension = ""//".php" for php apisf
    var separater = "/"
    var host = String()

    static let sharedInstance = ApiLinks()

    //handle the dev or prod modes    
    func setTheProdStatus(_ prodVaule : Bool) {
        prod = prodVaule
        if(prod) {
            host = prodHost
        } else {
            host = localHost
        }
    }

    let deviceToken = "updatedevicetoken" // your api name here
    func deviceTokenLink() -> String {
        return "\(httpPart)\(host)\(separater)\(deviceToken)\(apiExtension)"

}

响应模型类 -

    import ObjectMapper
import AlamofireObjectMapper
class DeviceTokenResponse: Mappable {
    var user_id: Int?
    var message: String?
    var status: String?
    required init?(map: Map){

    }

    func mapping(map: Map) {
        user_id <- map["user_id"]
        message <- map["message"]
        status <- map["status"]
    }
}

现在这就是你如何从 viewcontroller 调用 api -

func updateDeviceToken() {        
        let anotherWebServiceHandler = DeviceTokenDataHandler.init()
        anotherWebServiceHandler.fetchDataFromWebServicePost(["app_type":"user" as AnyObject], closure: { (response:SignUpResponse) -> Void in
            print(response.message);
        })
    }

【讨论】:

  • 哇,这工作真有魅力,是的,我正在寻找这个模型类。
猜你喜欢
  • 2018-12-08
  • 2018-05-21
  • 1970-01-01
  • 2016-11-27
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多