swift中的统一响应/错误处理

时间:2015-07-27 12:55:30

标签: ios swift oop enums afnetworking

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

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

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

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: ???)
    })
}

然后在一个名为ApiConnector的类中,我有类似的东西(使用AFNetworking):

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

现在你可以看到我在数据字段中有一个回调用户的回调。但是当出现错误并且我应该返回一些ErrorType而不是用户时会出现问题。

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

这样的东西
instance.constructor

并在Ok情况下返回我的User对象。如果Error返回我的ErrorType对象 - 但有点我无法理解它。

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

(我在代码中放置问号而不是类型,导致问题是什么,我没有解决方案ATM)

2 个答案:

答案 0 :(得分:2)

我选择了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和错误对象是不好的做法。

答案 1 :(得分:1)

有不同的方法可以做到这一点。其中一项是在CallbackNSObject中使用:

callback: (success: Bool, data: NSObject?)

然后在你的成功封闭中尝试演员:

if let user = data as? User{
// you have the user
}

如果此检查失败,请尝试以相同方式转换为错误。