gpt4 book ai didi

multithreading - 在后台线程中自变异 Swift 结构

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:01 24 4
gpt4 key购买 nike

假设我们有一个能够 self 突变的结构,它必须作为后台操作的一部分发生:

struct Thing {
var something = 0
mutating func operation(block: () -> Void) {

// Start some background operation
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {

// Mutate self upon background task completion
self.something += 1
block()

}

}
}

现在,当我在上下文中使用这样的结构时:

var myThing = Thing()
myThing.operation {
println(myThing.something)
}

println 给我 0,就好像 myThing 从未发生过突变一样。从 dispatch_async 中打印 self.something 显然会产生 1

我该如何解决这个问题,最好是不必在 operation 竞争 block 中传递更新的结构的 self 并覆盖主上下文中的原始变量?

// Ew
var myThing = Thing()
myThing.operation {
(mutatedThing) in
myThing = mutatedThing
println(myThing.something)
}

最佳答案

我添加了第二个答案,因为我的第一个答案解决了不同的问题。

我自己也遇到了这个困难,情况和你几乎一模一样。

在努力找出发生了什么并修复它之后,我意识到问题基本上是在应该使用引用类型的地方使用了值类型。

闭包似乎创建了结构的副本并对其进行操作,而原始结构保持不变——这更符合值类型的行为。

另一方面,期望的行为是闭包中执行的操作被闭包外的环境保留——换句话说,两个不同的上下文(闭包内和闭包外)需要引用相同的对象——这更符合引用类型的行为。

长话短说,我将结构更改为一个类。问题消失了,不需要其他代码。

关于multithreading - 在后台线程中自变异 Swift 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32431050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com