假设我们有一个能够自我变异的结构,它必须作为后台操作的一部分发生:
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
从未变异过。self.something
从内印dispatch_async
量明显出来1
。
我该如何解决这个问题,最好不必self
在operation
竞争块中传递更新的结构并在主上下文中覆盖原始变量?
// Ew
var myThing = Thing()
myThing.operation {
(mutatedThing) in
myThing = mutatedThing
println(myThing.something)
}