Arn*_*old 6 multithreading struct mutators swift
假设我们有一个能够自我突变的结构,它必须作为后台操作的一部分发生:
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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在上下文中使用这样的结构时:
var myThing = Thing()
myThing.operation {
println(myThing.something)
}
Run Code Online (Sandbox Code Playgroud)
该println给我0,就好像myThing从来没有发生突变.self.something从内部印刷dispatch_async明显产量1.
我如何解决这个问题,最好不必self在operation竞争块中传递更新的结构并覆盖主要上下文中的原始变量?
// Ew
var myThing = Thing()
myThing.operation {
(mutatedThing) in
myThing = mutatedThing
println(myThing.something)
}
Run Code Online (Sandbox Code Playgroud)
我正在添加第二个答案,因为我的第一个答案解决了另一个问题.
我在与你几乎完全相同的情况下遇到了这个困难.
在工作和工作并努力找出正在发生的事情并修复它之后,我意识到问题基本上是使用应该使用引用类型的值类型.
闭包似乎创建了结构的副本并对其进行操作,使原始保持不变 - 这更符合值类型的行为.
另一方面,期望的行为是闭包中执行的动作由闭包之外的环境保留 - 换句话说,两个不同的上下文(在闭包内部和外部)需要引用相同的对象 - - 这更符合引用类型的行为.
长话短说,我把结构改成了一个类.问题消失了,不需要其他代码.