我想知道如何解决这个问题:
我有一个应用程序,允许用户使用用户名和密码登录。然后,应用程序将凭据发送到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)
答案 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)
有不同的方法可以做到这一点。其中一项是在Callback
和NSObject
中使用:
callback: (success: Bool, data: NSObject?)
然后在你的成功封闭中尝试演员:
if let user = data as? User{
// you have the user
}
如果此检查失败,请尝试以相同方式转换为错误。