Предположим, у нас есть структура, способная к самомутации, которая должна происходить как часть фоновой операции:
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)
}