Swift [weak self] 用于在嵌套闭包中对 main 进行调度

Swift [weak self] for Dispatching on main in a nested closure

所以我读到 运行 DispatchQueue.main.async { } 你不需要声明 [weak self]。但是,我加入了一个新项目,偶然发现了这个:

public func dispatchOnMain(execute: @escaping () -> Void) {
    if Thread.isMainThread {
        execute()
        return
    }
    DispatchQueue.main.async(execute: execute)
}

这是一个开放的全局功能。从这里开始,做类似的事情:

class Foo {
    
    func bar() {
        dispatchOnMain {
            // Do something
        }
    }
}

这个 dispatchOnMain { 需要 weak self 吗?为什么/为什么不呢?

你想多了。对 weak self 的需求与你将要在哪个线程上无关,也与调度队列无关。如果你每次看到一对花括号都担心自己虚弱,那你就会精神崩溃。

弱自我与是否会有保留循环有关。保留循环是由于闭包捕获的对象长期存储闭包造成的。

这里不会发生这样的事情。当您只是说“现在执行此操作”时,无论线程如何,都不会出现保留循环。所以不需要任何预防措施。