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 异步方法和返回/完成块的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据