【问题标题】:Wrapping Alamofire calls into custom objects in Swift?将 Alamofire 调用包装到 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) 

    }

【问题讨论】:

    标签: ios swift swift2 alamofire


    【解决方案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 方法中创建一个通用方法,以便我也可以将它用于其他类型。发布了一个新问题:stackoverflow.com/questions/37995945/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多