繁体   English   中英

Swift异步方法和返回/完成块

[英]Swift async method and return / completion block

我正在尝试在我的项目中创建一个使用一些输入参数的异步方法。 如果参数正确,它将执行一些操作,然后调用完成块。

但是,如果输入参数不正确,则它将不会执行任何操作(因此,完成代码块将无法运行,因此我必须自己调用它)。

无论如何,我想知道最好的方法是什么...

我在想我可以让该方法返回一个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吗(我讨厌这个词,但刻画了我的意思)? 我可以完全采用其他方法吗?

谢谢

在我看来,可以使用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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM