首页 > 解决方案 > Swift [weak self] 用于在嵌套闭包中在 main 上调度

问题描述

所以我读到在运行时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? 为什么/为什么不呢?

标签: swiftmultithreadingdispatch-async

解决方案


你想太多了。对弱自我的需求与您将要使用的线程无关,与调度队列无关。如果你每次看到一对花括号都会担心自己虚弱,那你会很紧张。

弱自我与是否会有保留周期有关。保留周期是 由它捕获的对象长期存储闭包引起的。

这里没有发生这样的事情。当您只是说“立即执行此操作”时,无论线程如何,都不会出现保留周期。所以没有必要采取预防措施。


推荐阅读