使用“自我”的更好方式。在后台线程中?

Posted

技术标签:

【中文标题】使用“自我”的更好方式。在后台线程中?【英文标题】:Better way of using "self." in background thread? 【发布时间】:2019-07-23 12:42:55 【问题描述】:

DispatchQueue.global(qos: .background).async 添加到我的代码(Xcode 10、Swift 5)的单个函数后,滚动条如下所示:

这些是对需要“自我”的 var 和其他函数的 40 多个调用。

解决这个问题并不难(编辑器 > 修复所有问题),但它会大大降低可读性。

我知道可以创建这些 var 的新副本/引用并使用它们而不是外部的,但是会有很多新的副本/引用。

是否有第三种解决此问题的方法有助于提高可读性但不会更改初始代码(太多)?

【问题讨论】:

请发布一些您尝试过的代码。 你应该总是self。这看起来更好,而不是更糟。错误是一开始就忽略了它。随时随地输入self @SagarChauhan 抱歉,不知道代码在这里有什么帮助。每个人都知道self. 的样子,我并不是直接尝试用我的代码解决问题,而是更多地寻找替代方案。 @matt You should always say self - 即使您不在后台线程中?我从未见过有人这样做,而且我真的不需要self(除非您使用第二个线程),因为它不会添加任何内容并且也会降低可读性。 将闭包中的代码提取到方法/嵌套函数中,并改为传递方法/嵌套函数的名称? 【参考方案1】:

您可以创建一个嵌套函数或其他方法来放置您要执行的代码,然后将该嵌套函数或方法传递给DispatchQueue.main.async

这是一个带有嵌套函数的示例:

原码:

class Foo 
    var a = 0
    var b = 0
    var c = 0

    func f() 
        a = 1
        b = 1
        c = 1
    

异步执行:

class Foo 
    var a = 0
    var b = 0
    var c = 0

    func f() 
        func doAsync() 
            a = 1
            b = 1
            c = 1
        
        DispatchQueue.global(qos: .background).async(execute: doAsync)
    

如您所见,您不需要添加任何selfs。

【讨论】:

这就是我一直在寻找的解决方案 - 干净且简单。谢谢,我会用我的代码试试看! 抱歉,明天才能测试。 抱歉耽搁了!刚刚测试了它,它正在工作,谢谢!

以上是关于使用“自我”的更好方式。在后台线程中?的主要内容,如果未能解决你的问题,请参考以下文章

关于C# WPF线程后台运行的

如何让Task在非线程池线程中执行?

生成和管理后台线程的惯用 Clojure 方式

WinForm 中如何使用后台线程来操作UI

有没有人在后台线程中使用 ALAssetsLibrary 时遇到过崩溃?

文件重新加载后台线程与基于请求