我有以下异步递归代码:
func syncData() {
dal.getList(...) { [unowned self] list, error in
if let objects = list {
if oneTime {
oneTime = false
syncOtherStuffNow()
}
syncData() // recurse until all data synced
} else if let error = error {... }
func syncOtherStuffNow() { } // with its own recursion
我的理解是,递归将建立调用堆栈,直到所有函数调用完成为止,此时它们将全部展开并释放堆。
我还想从闭包内部触发另一个函数(syncOtherStuffNow
)。但是不想将它绑定到带有强引用的闭包上,以等待它返回(即使它也是异步的)。
我实际上如何才能触发syncOtherStuffNow()
选择器 trigger 来运行,并且不影响当前的闭包并保持其返回调用?
我考虑过使用Notifications,但是考虑到这两个函数在同一个类中,这似乎有些过分。
答案 0 :(得分:0)
由于dal.getList()
进行了回调,所以我猜它是异步的,因此第一个syncData
启动异步调用,然后立即返回,这使syncData()
返回。
如果syncOtherStuffNow()
异步,它将立即返回,因此dataSync()
不会等待它完成工作,因此继续执行到最后。
您可以通过在每个递归上放置一个断点,然后在调用堆栈上查看有多少个相同函数的调用,来测试sth是否构建了调用堆栈。
答案 1 :(得分:0)
我要做的是使用asyncAfter
递归,这将取消调用堆栈。