ios - 在 Swift 中将 Alamofire 调用包装到自定义对象中?

标签 ios swift swift2 alamofire

我正在使用 Alamofire 对我的服务器进行 REST 调用以获取、添加、更新和删除对象。我想知道的是,是否可以(并建议)将 Alamofire 调用包装到我自己的自定义对象 (DTO) 中,这样我就可以简单地执行 user.delete(id) 和 user.add(newUser) 之类的操作在我的代码库中使用 Alamofire 代码?如果是这样,我该怎么做才能返回成功和失败处理程序(来自 javascript 世界的“ promise ”)?像这样:

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) 

    }

最佳答案

我认为静态函数是你想要的,我为它写了一个例子:

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

关于ios - 在 Swift 中将 Alamofire 调用包装到自定义对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37948084/

相关文章:

ios - 无法从应用程序组 ios 中的共享容器中读取

Swift - 长按按钮上的手势以使用 AVFoundation 录制音频

ios - 使用标识符执行 segue 不会在 swift 2 中工作

swift - 用于 Swift 编码的 iOS 应用程序的 Ffmpeg

使用 Swift 2 进行 Base64 编码/解码

ios - 当用户离开并返回应用程序时如何防止动画完成

ios - 如何检测更改状态@property objective c

点击时iOS将表格 View 单元格动画化为全屏

ios - 将 MKMapView 放在 UITableView 后面

ios - Json 数据和我所做的类不匹配