【发布时间】:2016-09-22 11:08:23
【问题描述】:
我正在尝试在我的项目中创建一个采用一些输入参数的异步方法。如果参数正确,它会做一些事情,然后调用一个完成块。
但是,如果输入参数不正确,则它不会执行任何操作(因此完成块将不会运行,我必须自己调用它)。
无论如何,我想知道最好的方法是什么...
我想我可以让该方法返回一个 Status 枚举,其中包含输入的错误,然后还有完成块。
问题是完成块也可能出现错误。那么也许这应该是一个不同的错误类型?
类似这样...(以登录为例)。
enum LoginRequestStatus {
case missingEmail
case missingPassword
case requestingLogin
}
然后完成的错误可能是......
enum LoginError: Error {
case noUserFound
case invalidPassword
case success
}
那么函数可能看起来像这样......
func login(withEmail email: String, password: String, completion: (LoginError?) -> ()) -> LoginStatus {
if email.isEmpty() {
return LoginStatus.missingEmail
}
if password.isEmpty() {
return LoginStatus.missingPassword
}
//make some async request here or something...
//... if error...
completion(LoginError.invalidPassword)
return LoginStatus.requestingLogin
}
这有意义吗?是 Swifty 吗(我讨厌这个词,但它表达了我的意思)?有没有其他方法可以完全解决这个问题?
谢谢
【问题讨论】:
-
我想如果我的问题没看错,有两种类型的错误需要您管理。您可以通过在完成块中设置另一个变量(比如说 int 类型)而不使用返回类型来管理它。就像错误是“LoginRequestStatus”类型传递 100 和其他传递 101。然后在完成方法中检查 int 值是否为 100 那么它是“LoginRequestStatus”类型或另一个。并进行相应的管理。这有意义吗??
-
你的方式也没有错,使用
throws也没有错,每种方式也可以正常使用,Alamofire使用完成块和其他一些使用抛出来处理错误,另外,return LoginStatus这里似乎不需要,因为它总是返回LoginStatus.requestingLogin,调用有什么意义?
标签: ios swift asynchronous