Swift 异步方法和返回/完成块
Posted
技术标签:
【中文标题】Swift 异步方法和返回/完成块【英文标题】:Swift async method and return / completion block 【发布时间】: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
,调用有什么意义?
【参考方案1】:
在我看来,可以使用throws
来简化与方法的交互。我写一个小例子。有了这个实现,很容易不会因为exceptions
而错过错误。如果请求成功,将显示清晰的响应状态。
抛出错误:
enum LoginError: ErrorType
case missingEmail
case missingPassword
响应状态:
enum LoginRequestStatus
case noUserFound
case invalidPassword
case success
功能实现:
func login(withEmail email: String, password: String) throws -> LoginRequestStatus
guard email.characters.count > 0 else
throw LoginError.missingEmail
guard password.characters.count > 0 else
throw LoginError.missingPassword
// do some request
return LoginRequestStatus.success
【讨论】:
谢谢。我将把抛出错误与完成块结合起来。以上是关于Swift 异步方法和返回/完成块的主要内容,如果未能解决你的问题,请参考以下文章