1

我正在swift 3.0与框架的支持一起开发一个项目,Alamofire以连接我的 webservercalls。基本上我想使用一个我以前在swift 2.3声明方法的地方使用的单例类,然后在我想要执行它的任何视图控制器中,我将方法称为如下。

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

                if success {

                }

                }) { (error) in       

 }

我的要求是让这个代码工作,swift 3.0这样我就可以继续工作。对此的帮助将不胜感激。我的单例类的代码如下(此代码在 中swift 2.3,我想要在 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)")


    }
  }
}
4

1 回答 1

3

这是我在 Swift 3.x 中使用 Alamofire 4.x 和 SwiftyJSON 的经理。我更喜欢类方法来代替单例。

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

        }
    }
}

}

apiGet最好使用andapiPost方法在控制器本身中提供服务的名称或 url

如何使用它。
在您的控制器类或按钮事件中

首先导入SwiftyJSON您的控制器

import SwiftyJSON

然后随时随地调用您的登录服务

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!)
    }
于 2016-11-02T05:14:56.660 回答