swift - 如何从系统函数的完成处理程序闭包中返回?

Posted

技术标签:

【中文标题】swift - 如何从系统函数的完成处理程序闭包中返回?【英文标题】:swift - how to return from a within a completion handler closure of a system function? 【发布时间】:2018-01-30 13:55:29 【问题描述】:

我知道这行不通,因为 completion handlerbackground Thread 上,但是

我应该在哪里调度主队列或者我还有什么 怎么办?

这是代码:

static func isNotificationNotDetermined() -> Bool

    var isNotDetermined = false

    UNUserNotificationCenter.current().getNotificationSettings  (notificationSettings) in
        switch notificationSettings.authorizationStatus 
        case .notDetermined:
            isNotDetermined = true

        case .authorized:
            isNotDetermined = false

        case .denied:
            isNotDetermined = false

        
    

    return isNotDetermined

【问题讨论】:

在你的情况下,问题不在于后台线程,没关系(你不对 UI 做任何事情),它是“异步”的事实。寻找“异步 Swift 关闭”。你会经常得到关于 JSON/WebAPICall 的答案,但情况显然是一样的。 【参考方案1】:

你不能这样做; getNotificationSettings 是异步的,因此您应该在方法中传递一个闭包并在切换后立即调用。 像这样的:

static func isNotificationNotDetermined(completion: (Bool) -> Void) 

    UNUserNotificationCenter.current().getNotificationSettings  (notificationSettings) in
        var isNotDetermined = false
        switch notificationSettings.authorizationStatus 
        case .notDetermined:
            isNotDetermined = true

        case .authorized:
            isNotDetermined = false

        case .denied:
            isNotDetermined = false

        

        // call the completion and pass the result as parameter
        completion(isNotDetermined)
    


然后你会这样调用这个方法:

    YourClass.isNotificationNotDetermined  isNotDetermined in
        // do your stuff
    

【讨论】:

【参考方案2】:

你不能那样做。这不是因为完成处理程序在后台线程上。 这是因为函数getNotificationSettings() 是异步的。在您得到答案之前,它会立即返回。

想象你正在做晚饭,你问你的女儿“你哥哥会回家吃晚饭吗?”您的女儿需要打电话给您的儿子并找出答案。你一问就不会得到问题的答案。您必须等待您的女儿找到电话,拨打电话并向您报告。

异步函数就是这样。函数返回时答案未知。这就是完成处理程序的用途。一旦确定了答案,它就会执行一段代码。

【讨论】:

是的,但我不能将返回值放在完成处理程序中,这就是问题所在。 这是一个异步 API。不要与之抗争。编写您的代码,以便它可以对闭包内部的状态确定做出反应。 @Gereon 说了什么。您不能编写函数来返回真/假答案。这是不可能的。您需要编写函数来获取一个完成处理程序,该处理程序在异步getNotificationSettings() 函数竞争后执行。 查看@RicoCrescenzio 的回答。他重写了你的 isNotificationNotDetermined() 函数来关闭,就像你应该做的那样。 (已投票)

以上是关于swift - 如何从系统函数的完成处理程序闭包中返回?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 完成处理程序 - 转义尾随闭包

如何从 Swift 中的 void 闭包中返回一个值?

在 Swift 中遇到完成处理程序和闭包问题

Swift-使用完成处理程序更新闭包外的全局变量

使用完成处理程序(闭​​包)语法从objective-c文件调用swift文件中的函数

从包含闭包的 Swift 函数返回值