考虑以下:
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
}
Run Code Online (Sandbox Code Playgroud)
函数的闭包myClosure捕获了一个Bool我调用的函数bool,我想用bool它从闭包中返回filter.我把它放回到bool的范围内myClosure,但封闭filter对它一无所知.如何才能达到bool从filter关闭状态恢复所需的效果?谢谢.
如果闭包是非转义的,这很容易:
let my_filtered_objects = my_objects.filter { obj in
var retVal = false
myClosure(obj.id) { bool in
retVal = bool
}
return retVal
}
Run Code Online (Sandbox Code Playgroud)
对于转义闭包,您可能需要使用信号量来确保在函数返回时闭包已完成:
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
}
Run Code Online (Sandbox Code Playgroud)
正如@Woof所说,使用调度组异步执行此操作可能会更好.