在后台线程中使用 "self." 的更好方法?
Better way of using "self." in background thread?
在我的代码(Xcode10,Swift5)的单个函数中添加DispatchQueue.global(qos: .background).async {}
后,滚动条看起来像这样:
这些是对需要 "self.".
的 vars 和其他函数的 40 多个调用
修复这个问题并不难(编辑器 > 修复所有问题),但它大大降低了可读性。
我知道可以为这些变量创建新的副本 of/references 并使用它们而不是外部变量,但是之后会有很多新的 copies/references。
是否有第三种解决此问题的方法,它有助于提高可读性但不会更改初始代码(太多)?
您可以创建嵌套函数或其他方法来放入要执行的代码,然后将该嵌套函数或方法传递给 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)
}
}
如您所见,您不需要添加任何 self
。
在我的代码(Xcode10,Swift5)的单个函数中添加DispatchQueue.global(qos: .background).async {}
后,滚动条看起来像这样:
这些是对需要 "self.".
的 vars 和其他函数的 40 多个调用修复这个问题并不难(编辑器 > 修复所有问题),但它大大降低了可读性。
我知道可以为这些变量创建新的副本 of/references 并使用它们而不是外部变量,但是之后会有很多新的 copies/references。
是否有第三种解决此问题的方法,它有助于提高可读性但不会更改初始代码(太多)?
您可以创建嵌套函数或其他方法来放入要执行的代码,然后将该嵌套函数或方法传递给 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)
}
}
如您所见,您不需要添加任何 self
。