2017-12-24 2 views
0

以下は、私がapi呼び出しのために使用したコードです。ここでは、すべてのView Controllerでこのコードを減らす方法です。私はalamofire API呼び出しのモデルクラスを作成できますか?AliFiでSwiiftに電話をかけているApi?

Login Screen

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 
      { 
      } 
    } 
} 
+0

あなたは「コードを減少させる」とはどういう意味ですか? –

+0

私はあなたがそれを小さくすることはできませんと思っていませんが、別のView Controllerから呼び出す場合は、コールのシングルトンをシンプルにして関数の補完ハンドラを作成し、それを他のView Controllerから呼び出すことができます。 – Martheli

答えて

1

あなたはのために必ず、すべてのビューコントローラのコードを削減することができます -

  1. (などPUT、POSTをGET)残りのすべてのAPIリクエストを処理する基本クラスを作成します。
  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" 
    }  

} 

ApiLinksクラスAPIリンク -

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); 
     }) 
    } 
+0

Wowこれは魅力的な作品です。はい、このモデルクラスを探しています。 –

関連する問題