我有下面的示例代码,问题是 self 在 fetchMovies 函数的持续时间内保留,有没有办法避免这种情况而不显式保留任务并取消它? 如果我直接将 fetch movie 调用的内容移到 Task 内,则不会保留 self,我的实际代码更复杂,我不想将所有内容都保留在一个函数中。
我可能可以使 fetchMovies 静态并传递可选的 self 作为参数,但我觉得我在这里遗漏了一些非常明显的东西。
class TestViewModel {
init() {
print("Init")
Task { [weak self] in
await self?.fetchMovies()
}
}
deinit {
print("Deinit")
}
func fetchMovies() async {
try? await Task.sleep(nanoseconds: 3 * 1_000_000_000)
}
}
我尝试将其移动到外部课程中,但这不是我想要的。
不,一旦函数启动,它将保持对
self
的强引用,直到完成。当不再需要时您想取消它。
.task
视图修饰符将自动取消它。但是,是的,在 UIKit 中,您可以保留对 Task
的引用,并在不再需要时手动取消它(例如,在 viewDidDisappear
或您拥有的其他内容中)。