【问题标题】:Swift return value from function inside dispatch group notify [duplicate]调度组内函数的Swift返回值通知[重复]
【发布时间】:2021-06-26 07:38:40
【问题描述】:

在执行未立即完成的函数后,我试图从函数返回值。

例如:

func returnSomeValue() -> String {
    let group = DispatchGroup()
    group.enter()
    service.longTimeTofinish(onFinish: { group.leave() } ) // <-- this function takes long time to finish

    group.notify(queue: .main) {
        return "Returning some value as example" // <-- Here is the issue
    }
}

编译器显示错误“无法将 'String' 类型的值转换为闭包结果类型 Void”。 notify 内的闭包无法将值返回给我的外部函数。任何想法如何解决这个问题?

【问题讨论】:

  • 不要return 这样,您正在使用异步调用,为什么要使其同步?通常,这是个坏主意。您确定吗?为什么不改用func yourFunc(completion: ((String) -&gt; Void))returnSomeValue() 的代码是什么?
  • 从技术上讲,我认为您可以group.wait() 而不是group.notify,但我认为您不应该这样做。
  • 您在滥用DispatchGroup。它不是为使 one 异步任务同步而设计的。

标签: swift


【解决方案1】:

notify 里面的返回是void 它的作用域和函数不同,你需要一个补全

func returnSomeValue(completion:@escaping((String) -> ())) {
    let group = DispatchGroup()
    group.enter()
    service.longTimeTofinish(onFinish: { group.leave() } ) // <-- this function takes long time to finish

    group.notify(queue: .main) {
        completion("Returning some value as example")
    }
}

或者更常见的是什么

func returnSomeValue(completion:@escaping((String) ->())) { 
    service.longTimeTofinish(onFinish: { completion("Returning some value as example") } )  
}

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 2021-03-27
    • 2016-08-14
    • 1970-01-01
    • 2019-10-12
    • 2016-10-16
    • 2016-11-21
    • 1970-01-01
    相关资源
    最近更新 更多