2016-12-21 3 views
0

Я новичок в iOS, и я немного смущен тем, что, как использовать singleton с Alamofire и как одноэлемент важен. Я создал класс networkWrapper, в котором я написал сообщение Alamofire и метод get, но я не использовал singleton.Как использовать singleton с Alamofire с помощью Swift 3?

Как создать класс Wrapper для Alamofire с singleton? Как я могу получить все трюки, которые действительно важны?

Ниже приведен код для класса-оболочки:

import Foundation 
import UIKit 
import Alamofire 
import SwiftyJSON 

class AFWrapper: NSObject { 

//TODO :- 
/* Handle Time out request alamofire */ 


class func requestGETURL(_ strURL: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) 
    { 
     Alamofire.request(strURL).responseJSON { (responseObject) -> Void in 
      //print(responseObject) 
      if responseObject.result.isSuccess { 
       let resJson = JSON(responseObject.result.value!) 
       //let title = resJson["title"].string 
       //print(title!) 
       success(resJson) 
      } 

     if responseObject.result.isFailure { 
      let error : Error = responseObject.result.error! 
      failure(error) 
     } 
    } 
    } 

static func requestPOSTURL(_ strURL : String, params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){ 
    Alamofire.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON { (responseObject) -> Void in 
     //print(responseObject) 
     if responseObject.result.isSuccess { 
      let resJson = JSON(responseObject.result.value!) 
      success(resJson) 
     } 
     if responseObject.result.isFailure { 
      let error : Error = responseObject.result.error! 
      failure(error) 
     } 
    } 
    } 
} 

В моем контроллере:

  if newLength == 6 
      { 
       let textZipCode = textField.text! + string 

       let dict = ["id" : "43","token": "2y103pfjNHbDewLl9OaAivWhvMUp4cWRXIpa399","zipcode" : textZipCode] as [String : Any] 

       //Call Service 
       AFWrapper.requestPOSTURL(HttpsUrl.Address, params: dict as [String : AnyObject]?, headers: nil, success: { (json) in 
        // success code 
        print(json) 
       }, failure: { (error) in 
        //error code 
        print(error) 
       }) 


       setFields(city: "Ajmer", state: "Rajasthan", country: "India") 
       return newLength <= 6 
      } 

ответ

1

Может быть вам это нужно:

import UIKit 
import Alamofire 

struct FV_API 
{ 
    //URL is http://www.stack.com/index.php/signup 
    static let appBaseURL = "" // assign your base url suppose: http://www.stack.com/index.php 
    static let apiSignUP = "" // assign signup i.e: signup 
} 

class APIManager: NSObject 
{ 
    //MARK:- POST APIs 
    class func postAPI(_ apiURl:String, parameters:NSDictionary, completionHandler: @escaping (_ Result:AnyObject?, _ Error:NSError?) -> Void) 
    { 
     var strURL:String = FV_API.appBaseURL // it gives http://www.stack.com/index.php and apiURl is apiSignUP 

     if((apiURl as NSString).length > 0) 
     { 
      strURL = strURL + "/" + apiURl // this gives again http://www.stack.com/index.php/signup 
     } 

     _ = ["Content-Type": "application/x-www-form-urlencoded"] 

     print("URL -\(strURL),parameters - \(parameters)") 

     let api = Alamofire.request(strURL,method: .post, parameters: parameters as? [String : AnyObject], encoding: URLEncoding.default) 

     // ParameterEncoding.URL 
     api.responseJSON 
      { 
       response -> Void in 

       print(response) 

       if let JSON = response.result.value 
       { 
        print("JSON: \(JSON)") 
        completionHandler(JSON as AnyObject?, nil) 
       } 
       else if let ERROR = response.result.error 
       { 
        print("Error: \(ERROR)") 
        completionHandler(nil, ERROR as NSError?) 
       } 
       else 
       { 
        completionHandler(nil, NSError(domain: "error", code: 117, userInfo: nil)) 
       } 
     } 
    } 

В других NSObject я сделал этот метод т.е. для регистрации:

class SignUp: NSObject 
{ 
    class func registerWithAPI(firstName: String, lastName:String, completionHandler: @escaping (_ Result:AnyObject?, _ Error:NSError?) -> Void) 
    { 
     let dict = NSMutableDictionary() 

     if !firstName.isEmpty 
     { 
      dict.setValue(firstName, forKey: "firstname") 
     } 
     if !lastName.isEmpty 
     { 
      dict.setValue(lastName, forKey: "lastname") 
     } 

     APIManager.postAPI(FV_API.apiSignUP, parameters: dict) 
     { 
      (Result, Error) -> Void in 
      completionHandler(Result, Error) 
     } 
    } 
} 

В классе контроллера я сделал метод для вызова API, как:

func apiForSignup() 
    { 
     SignUp.registerWithAPI(firstName: txtFieldFirstName.text!, lastName: txtFieldLastName.text!) 
     { 
      (Result, Error) -> Void in 
      // write code 
} 
+0

Хорошо позвольте мне проверить это. Спасибо – kishor0011

+0

Пожалуйста, уточните мой обновленный вопрос, где я звоню. Сказал (а) спасибо: – kishor0011

+0

Не могли бы вы оформить вашу проблему? В контроллере вы написали APIManager.apiPost(), но ваше имя класса NSObject является AFWrapper. Если вы используете мой ответ, пожалуйста, следуйте всем шагам. – Amanpreet

5

Я не смотрел глубоко в коде. В стриже мы можем создать синглтон по

static let sharedInstance = AFWrapper() 

И это создаст одноэлементный экземпляр класса, так что класс и статический для функций экземпляра класса синглтона не нужен. См. Ниже код для одноэлементного класса.

import Foundation 
import UIKit 
import Alamofire 
import SwiftyJSON 

class AFWrapper: NSObject { 

    static let sharedInstance = AFWrapper() 

    //TODO :- 
    /* Handle Time out request alamofire */ 


    func requestGETURL(_ strURL: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) 
    { 
     Alamofire.request(strURL).responseJSON { (responseObject) -> Void in 
      //print(responseObject) 
      if responseObject.result.isSuccess { 
       let resJson = JSON(responseObject.result.value!) 
       //let title = resJson["title"].string 
       //print(title!) 
       success(resJson) 
      } 

      if responseObject.result.isFailure { 
       let error : Error = responseObject.result.error! 
       failure(error) 
      } 
     } 
    } 

    func requestPOSTURL(_ strURL : String, params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){ 
     Alamofire.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON { (responseObject) -> Void in 
      //print(responseObject) 
      if responseObject.result.isSuccess { 
       let resJson = JSON(responseObject.result.value!) 
       success(resJson) 
      } 
      if responseObject.result.isFailure { 
       let error : Error = responseObject.result.error! 
       failure(error) 
      } 
     } 
    } 
} 

Теперь вы можете вызвать функцию экземпляра класса Singleton по

AFWrapper.sharedInstance.requestPOSTURL(HttpsUrl.Address, params: dict as [String : AnyObject]?, headers: nil, success: { (json) in 
    // success code 
    print(json) 
}, failure: { (error) in 
    //error code 
    print(error) 
}) 
+0

Все верно? На самом деле в первый раз я использую singleton. И хотел узнать, почему это лучше? Спасибо, – kishor0011

+0

Приглашаем вас. Если вы сочтете это полезным, примите этот ответ. Так что другие могут ссылаться. –

+0

Хорошо, конечно , но все верно? – kishor0011

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