如何避免异步函数保留自身

问题描述 投票:0回答:1

我有下面的示例代码,问题是 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)
    }
}

我尝试将其移动到外部课程中,但这不是我想要的。

ios swift async-await
1个回答
0
投票

不,一旦函数启动,它将保持对

self
的强引用,直到完成。当不再需要时您想取消它。

在 SwiftUI 中,当视图关闭时,

.task
视图修饰符将自动取消它。但是,是的,在 UIKit 中,您可以保留对
Task
的引用,并在不再需要时手动取消它(例如,在
viewDidDisappear
或您拥有的其他内容中)。

© www.soinside.com 2019 - 2024. All rights reserved.