将 Alamofire 调用包装到 Swift 中的自定义对象中?
Posted
技术标签:
【中文标题】将 Alamofire 调用包装到 Swift 中的自定义对象中?【英文标题】:Wrapping Alamofire calls into custom objects in Swift? 【发布时间】:2016-06-21 15:05:24 【问题描述】:我正在使用 Alamofire 对我的服务器进行 REST 调用,以获取、添加、更新和删除对象。我想知道的是,是否可以(并且推荐)将 Alamofire 调用包装到我自己的自定义对象(DTO)中,以便我可以简单地执行 user.delete(id) 和 user.add(newUser) 之类的操作在我的代码库中使用 Alamofire 代码?如果是这样,我该怎么做才能返回成功和失败处理程序(来自 javascript 世界的“承诺”)?像这样的:
user.add(newUser)
.success(userObject)
.error(response)
这是我当前的代码:
//register a user
let parameters = [“username”: txtUsername.text! , "password": txtPassword.text!]
Alamofire.request(.POST, “http://myserver.com/users", parameters: parameters, encoding: .JSON)
.validate()
.responseObject (response: Response<User, NSError>) in
if let user = response.result.value
self.user = user
User.swift
final class User : ResponseObjectSerializable, ResponseCollectionSerializable
var id: Int
var firstName: String?
var lastName: String?
var email: String?
var password: String?
init?(response: NSHTTPURLResponse, representation: AnyObject)
id = representation.valueForKeyPath("id") as! Int
firstName = representation.valueForKeyPath("first_name") as? String
lastName = representation.valueForKeyPath("last_name") as? String
email = representation.valueForKeyPath("email") as? String
password = representation.valueForKeyPath("password") as? String
static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User]
var users: [User] = []
if let representation = representation as? [[String: AnyObject]]
for userRepresentation in representation
if let user = User(response: response, representation: userRepresentation)
users.append(user)
return users
//Can I wrap my alamofire calls in methods like this:
func getById(id: Int)
func getAll()
func add(user: User)
func update (user: User)
func delete(id: int)
【问题讨论】:
【参考方案1】:我认为静态函数是你想要的,我为它写了一个例子:
final class User
var valueHandle :((AnyObject) -> ())?
var errorHandle :((NSError)->())?
func success(value:(AnyObject) -> ())->Self
//pass success handle
self.valueHandle = value
return self
func error(error:(NSError)->())->Self
//pass error handle
self.errorHandle = error
return self
static func getById(id: Int)->User
return userRequest(.GET, urlString: "https://httpbin.org/get", param: ["foo": "bar"])
static func userRequest(method:Alamofire.Method , urlString:String ,param:[String: AnyObject]?) -> User
let user = User()
Alamofire.request(method, urlString, parameters:param)
.validate()
.responseJSON response in
switch response.result
case .Success(let value):
//invoke with your back userobj
user.valueHandle?(value)
print(value)
case .Failure(let error):
user.errorHandle?(error)
return user
然后你可以使用like:
User.getById(1)
.success (value) in
print("value = \(value)")
.error (error) in
print("error = \(error)")
希望对你有帮助:D
【讨论】:
太好了,让我试一试。 @Prabhu 以您的方式更改句柄类型和请求,也许它会起作用 我正在尝试从您的 userRequest 方法中创建一个通用方法,以便我也可以将它用于其他类型。发布了一个新问题:***.com/questions/37995945/…以上是关于将 Alamofire 调用包装到 Swift 中的自定义对象中?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)
swift3中带有objectmapper的alamofire包装类问题