2016-11-02 6 views
1

Ich arbeite an einem Projekt in swift 3.0 zusammen mit der Unterstützung von Alamofire Framework als interline meine Webservercalls. Im Grunde möchte ich eine Singleton-Klasse verwenden, die ich zuvor in swift 2.3 verwendet habe, wo ich die Methode deklariere, und dann, in was auch immer der Viewcontroller ich es ausführen möchte, rufe ich die Methode wie folgt auf.Alamofire Singleton Webservercall Klassenfehler

APIManager.sharedInstance.login(username, password: password, completion: { (user,success) in 

       if success { 

       } 

       }) { (error) in  

} 

Meine Forderung ist dieser Code in swift 3.0 zu bekommen, so konnte ich auf der Arbeit tragen. Hilfe dazu würde sehr zu schätzen wissen. Der Code meiner Singleton-Klasse wie unten (dieser Code ist in , ich möchte dies in 3.0).

import UIKit 
    import Alamofire 
    import SwiftyJSON 

struct Singleton { 
    static let instance : APIManager = APIManager() 
} 

public class APIManager: NSObject { 
    public class var sharedInstance: APIManager { 
    return Singleton.instance 
    } 

    let manager = Manager() 

    override init() { 

    } 

    //MARK:====Login==== 

    //MARK: methods 

    func login(username: String, password: String, completion: (user: User, success: Bool) ->(), failed:(error: NSError) ->()) -> Request { 
    let urlRequest // Create a URLRequest and pass to the method 

    return manager.request(urlRequest) 
     .validate() 
     .responseJSON { response in 
     if let error = response.result.error { 
      failed(error: error) 
      print(error) 
      return; 
     } 
     let ok = ((response.result.value as! JSONDictionary)["success"] as? Bool)! 
     let userJson = JSON((response.result.value as! JSONDictionary)["user"]!) 

     let token = ((response.result.value as! JSONDictionary)["token"] as? String)! 
     NSUserDefaults.standardUserDefaults().setValue(token, forKey: UserDefaultKey.Token) 
     NSUserDefaults.standardUserDefaults().synchronize() 
     let user = User(json: userJson) 
     completion(user: user,success: ok) 

     print ("Auth is : \(token)") 


    } 
    } 
} 
+0

SO wollen, wo das Problem wie einige Details HIER – dragoneye

+0

Sir PUT Ich habe in meinem Körper erwähnt, dass meine Anforderung ist, diesen Code in Swift 3.0 seit seiner Eingabe in Swift 2.3 zu konvertieren. Ihre Hilfe würde sehr schätzen – danutha

+0

Ich denke, es gibt kein Problem, dass Sie diesen Code für SWIFT3 verwenden können, aber daran erinnern, würden Sie etwas Warnung von Alamorefire Ich denke, Sie müssen Ihren POD für Alamorefire aktualisieren (falls Sie 2,3 POD für Alamorefire verwenden) – dragoneye

Antwort

2

Dies ist mein Manager in Swift 3.x mit Alamofire 4.x und SwiftyJSON. Ich bevorzuge Klassenmethoden anstelle von Singletons.

import UIKit 
import Alamofire 
import SwiftyJSON 

class APIManager: NSObject { 

class func apiGet(serviceName:String,parameters: [String:Any]?, completionHandler: @escaping (JSON?, NSError?) ->()) { 

    Alamofire.request(serviceName, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in 

     switch(response.result) { 
     case .success(_): 
      if let data = response.result.value{ 
       let json = JSON(data) 
       completionHandler(json,nil) 
      } 
      break 

     case .failure(_): 
      completionHandler(nil,response.result.error as NSError?) 
      break 

     } 
    } 
} 

class func apiPost(serviceName:String,parameters: [String:Any]?, completionHandler: @escaping (JSON?, NSError?) ->()) { 

    Alamofire.request(serviceName, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in 

     switch(response.result) { 
     case .success(_): 
      if let data = response.result.value{ 
       let json = JSON(data) 
       completionHandler(json,nil) 
      } 
      break 

     case .failure(_): 
      completionHandler(nil,response.result.error as NSError?) 
      break 

     } 
    } 
} 

} 

besser den Namen oder die URL des Dienstes in der Steuerung zur Verfügung zu stellen, sich mit den apiGet und apiPost Methoden

Wie es zu benutzen.
In Ihrem Controller-Klasse oder Tastenereignis

Ersteinfuhr SwiftyJSON in Ihrem Controller

import SwiftyJSON 

Dann rufen Sie Ihre Login-Service, wo immer Sie

let params = [ 
     "userName":"abc", 
     "password":"abc" 
    ] 

APIManager.apiPost(serviceName: "yourLoginURL", parameters: params) { (json:JSON?, error:NSError?) in 
     if error != nil { 
      print(error?.localizedDescription) 
      return 
     } 
     print(json!) 
    } 
+0

Sir Es gibt mir eine Fehlermeldung, die undeline Modul nicht geladen werden für 'Alamorefire' – danutha

+0

Reinigen und bauen Sie das Projekt –

+0

Jetzt sagt es die Verwendung von undeclared Typ 'JSON' – danutha