Alamofire 单例 webservercall 类错误

Posted

技术标签:

【中文标题】Alamofire 单例 webservercall 类错误【英文标题】:Alamofire singleton webservercall class error 【发布时间】:2016-11-02 04:42:14 【问题描述】:

我正在swift 3.0 中开展一个项目,同时支持Alamofire 框架来连接我的网络服务器调用。基本上我想使用我之前在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)")


    
  

【问题讨论】:

所以问题在这里放了一些细节 先生,正如我在正文中提到的,显然我的要求是将此代码转换为 swift 3.0,因为它是用 swift 2.3 编写的。非常感谢您的帮助 我认为您可以将此代码用于 SWIFT3,但请记住您会从 Alamorefire 收到一些警告) 我正在使用最新的 POD,但仍然出现错误:return manager.request(urlRequest) // API 管理器没有成员“请求” @dragoneye 请停止大喊大叫。谢谢。 【参考方案1】:

这是我在 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 方法在控制器本身中提供服务的名称或 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!)
    

【讨论】:

先生它给了我一个错误,说无法加载'Alamorefire'的undeline模块 清理并构建项目 现在它说使用未声明的类型'JSON' 这个类和模块加载有什么关系。它只是一个简单的帮助代码。使用 Alamofire 检查您的项目设置 @danutha 你必须在你的控制器兄弟中import SwiftyJSON。这些是您需要了解的基本知识。

以上是关于Alamofire 单例 webservercall 类错误的主要内容,如果未能解决你的问题,请参考以下文章

正确使用 Alamofire 队列

如果我使用单例网络服务发出网络请求,是不是需要使用 [weak self]?

Alamofire 网络活动指示器未显示

为啥没有网络连接时 Alamofire 需要这么长时间才能超时?

网络请求组件--SwiftMesh简介

如何快速在单例中使用此代码?