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
最好使用 apiGet
和 apiPost
方法在控制器本身中提供服务的名称或 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 类错误的主要内容,如果未能解决你的问题,请参考以下文章
如果我使用单例网络服务发出网络请求,是不是需要使用 [weak self]?