考虑以下几点:
func myClosure(_ my_object: MyObject, completion: @escaping (Bool) -> Void) {
var bool: Bool
...
completion(bool)
}
let my_filtered_objects = my_objects.filter { obj in
myClosure(obj.id) { bool in
return bool // doesn't return from the filter closure
}
return true // returns from the filter closure
}
函数 myClosure
的闭包捕获了一个 Bool
,我称之为 bool
,我想使用 bool
从 filter
中的闭包返回。我放置的内容返回 myClosure
范围内的 bool
,但 filter
中的闭包对此一无所知。如何实现从 filter
的闭包中返回 bool
的预期效果?谢谢。
最佳答案
如果闭包是非转义的,这很容易:
let my_filtered_objects = my_objects.filter { obj in
var retVal = false
myClosure(obj.id) { bool in
retVal = bool
}
return retVal
}
对于转义闭包,您可能需要使用信号量来确保在函数返回时闭包已完成:
let my_filtered_objects = my_objects.filter { obj in
var retVal = false
let semaphore = DispathchSemaphore(value: 0)
myClosure(obj.id) { bool in
retVal = bool
semaphore.signal()
}
semaphore.wait()
return retVal
}
不过,正如@Woof 所说,使用调度组异步执行此操作可能性能更好。
关于Swift 从闭包中获取返回值并使用它从它所在的闭包中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45827439/