あなたはのために必ず、すべてのビューコントローラのコードを削減することができます -
- (などPUT、POSTをGET)残りのすべてのAPIリクエストを処理する基本クラスを作成します。
- 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);
})
}
あなたは「コードを減少させる」とはどういう意味ですか? –
私はあなたがそれを小さくすることはできませんと思っていませんが、別のView Controllerから呼び出す場合は、コールのシングルトンをシンプルにして関数の補完ハンドラを作成し、それを他のView Controllerから呼び出すことができます。 – Martheli