A következő kódom van:
func foo() {
var sum = 0
var pendingElements = 10
for i in 0 ..< 10 {
proccessElementAsync(i) { value in
sum += value
pendingElements--
if pendingElements == 0 {
println(sum)
}
}
}
}
Ebben az esetben a proccessElementAsync
függvény, ahogy a neve is mutatja, aszinkron módon dolgozza fel a bemeneti paraméterét, és amikor befejezi, meghívja a megfelelő befejezési kezelőt.
Ennek a megközelítésnek az a kellemetlensége, hogy mivel a pendingElements
változót több szálon keresztül érik el, lehetséges, hogy a if pendingElements == 0
utasításnak soha nem lesz igaz értéke.
C#-ban valami ilyesmit tudunk tenni:
Object lockObject = new Object();
...
lock (lockObject) {
pendingElements--;
if (pendingElements == 0) {
Console.WriteLine(sum);
}
}
és ez biztosítja, hogy ez a változó egyszerre csak egy szál számára lesz elérhető. Van valami mód arra, hogy ugyanezt a viselkedést elérje a Swiftben?
func synchronized(object:AnyObject!, @noescape _ closure: () throws -> ()) rethrows { objc_sync_enter(object) defer { objc_sync_exit(object) } try closure() }
08.02.2016foo()
függvényből. Sajnálatos :-( 01.10.2018