我正在 swift 3.0
中开发一个项目,同时 Alamofire
框架支持我的网络服务器调用。基本上我想使用我之前在 swift 2.3
中使用的单例类,我在其中声明该方法,然后在我想要执行它的任何 View Controller 中调用该方法,如下所示。
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)")
}
}
}
最佳答案
这是我在 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
和 apiPost
方法在 Controller 中提供服务的名称或 url
如何使用它。
在你的 Controller 类或按钮事件中
首先在你的 Controller 中导入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!)
}
关于ios - Alamofire 单例 webservercall 类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372620/