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

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.

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

// Ew
var myThing = Thing()
myThing.operation {
    (mutatedThing) in
    myThing = mutatedThing
    println(myThing.something)
}
Run Code Online (Sandbox Code Playgroud)

Le *_*ced 6

我正在添加第二个答案,因为我的第一个答案解决了另一个问题.

我在与你几乎完全相同的情况下遇到了这个困难.

在工作和工作并努力找出正在发生的事情并修复它之后,我意识到问题基本上是使用应该使用引用类型的值类型.

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

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

长话短说,我把结构改成了一个类.问题消失了,不需要其他代码.