ios - Alamofire 单例 webservercall 类错误

标签 ios objective-c swift swift3 swift2

我正在 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

        }
    }
}

}

最好使用 apiGetapiPost 方法在 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/

相关文章:

objective-c - 运行应用程序时加载默认屏幕截图

ios - MKMapView 未在 mapType MKMapTypeStandard 和 MKMapTypeHybrid 上加载

ios - IOS上的Cordova文件上传错误

objective-c - 快速设置 UIToolBar 背景图片

swift - 如何在以下情况下 swift 使用枚举?

ios - 错误域=NSCocoaErrorDomain 代码=3840 "No string key for value in object around character 1."

ios - iOS 5 中 UIScrollView layoutSubviews 行为发生变化?

ios - 插入新的 uiview 时如何移动/推送其他 uiview

objective-c - AsyncSocket:如何定义读取长度并仅在达到读取长度时获得回调

swift - 负数减法,正数加法