请考虑以下几点:
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中的闭包返回。我将返回bool放在myClosure的作用域中,但filter中的闭包对此一无所知。如何才能达到从filter的闭包中返回bool的预期效果?谢谢。
发布于 2017-08-23 10:06:39
如果闭包是非转义的,这很容易:
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所说,使用分派组异步执行此操作可能会更好。
https://stackoverflow.com/questions/45827439
复制相似问题