将 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 中的自定义对象中?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire Swift 3.0 调用中的额外参数

Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)

swift3中带有objectmapper的alamofire包装类问题

Swift 1.2 的 Alamofire 生成错误

如何使用Alamofire Router来组织API调用?(swift Alamofire5)

表视图数据未在 Alamofire 发布请求调用 swift 3 中显示