快速统一响应/错误处理

弹药

我想知道如何解决这样的问题:

我有一个允许用户使用用户名和密码登录的应用程序。然后,应用程序将凭据发送到API服务器,并作为响应获取记录的用户数据

在我的模型中,我定义了一个User类

class User {

var id: String
var firstName: String?
var lastName: String?
var email: String
var permissions: String?
var birthday: String?
var subscription: String?


init(id: String, firstName: String?, lastName: String?, email: String, permissions: String?, birthday: String?, subscription: String?) {
    self.id = id
    self.firstName = firstName
    self.lastName = lastName
    self.email = email
    self.permissions = permissions
    self.birthday = birthday
    self.subscription = subscription
}

然后,在一个名为ApiConnector的类中,我有类似以下内容(使用AFNetworking):

func loginUser(mainAddress: String, additionalAddr: String, email: String, password: String, callback: (success: Bool, data: User) -> Void){

    let fullAddress = mainAddress + additionalAddr
    var parameters = ["email":email, "password":password]

    manager.POST( fullAddress,
        parameters: parameters,
        success: { (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in 
            let json = JSON(data: operation.responseData)

            //HERE I HAVE A JSON WITH USER DATA
            callback(success: true, data: ???)
        },
        failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
            let json = JSON(data: operation.responseData)
               //HERE I HAVE A JSON WITH ERROR
            callback(success: false, data: ???)
    })
}

现在,如您所见,我在数据字段中有一个返回User的回调。但是,当发生错误时,我应该返回一些ErrorType,而不是User,这是一个问题。

我在想如何统一响应,以便创建类似

enum Result<T, E> {
case Ok(T)
case Error(E)
}

并在确定的情况下返回我的User对象。如果发生错误,请返回我的ErrorType对象-但是有点无法解决。

谁能解释我在我的情况下如何做一个统一的响应类型?

(我在代码中放置了问号而不是类型,原因就是问题所在,而我没有解决方案的ATM)

yershuachu

我会选择Optional并与装饰好的NSError交换成功以获取不错的错误消息。例如这样的例子:

class User {}
class ServerResponseError {
    var error: NSError
    var message: String {
        get {
            switch(error.code) {
                case 500:
                    return "server error"
                default:
                    return "unknown error"
            }
        }
    }
    init(error: NSError) {
        self.error = error
    }
}

func loginUser(callback: (user: User?, error: ServerResponseError?) -> Void){
    // something went wrong on server
    var error: NSError = NSError(domain: "", code: 500, userInfo: nil)
    callback(user: nil, error: ServerResponseError(error:error))
}

loginUser { (user, error) -> Void in
    print(error.message)
}

您还可以修饰将从服务器返回的错误对象,并以相同的方式(通过用户nil)将其传递。但是我认为返回200和错误对象是一种不好的做法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章