Podczas testowania mojego kodu w Sierra odkryłem, że metody, które poprzednio obsługiwały równoległe kolejki, przestały działać.Aplikacja Swift używająca DispatchQueue.concurrentPerform (iteracje :) nie działa już równolegle w systemie Mac OS Sierra
Analizując błąd w mojej bazie kodu C++, jeden z użytkowników zasugerował obejście, które wymagało jawnego nazwania celu dla deklaracji kolejki (zobacz ten wpis: C++11 app that uses dispatch_apply not working under Mac OS Sierra), który prawdopodobnie rozwiązał problem.
w Swift 3, następujący kod zostanie wykorzystany do wykonania zamknięcia jednocześnie, ale jest wykazujące podobną ale przykład C++ w powyższym poście:
import Foundation
import GameKit
DispatchQueue.concurrentPerform(iterations: 1000) { index in
let pauseTime = GKRandomSource.sharedRandom().nextInt(upperBound: 5)
sleep(UInt32(pauseTime))
print(index)
}
... Jednak, kiedy wykonaj to, uruchamia każdy blok szeregowo, a indeksy są wyprowadzane w kolejności numerycznej.
Ktoś wie, w jaki sposób mogę wykorzystać obejście zalecane w tym poście, aby rozwiązać problemy związane z wysyłką w "Swobodnym" dla przesyłek?
Czy zadzwonić 'concurrentPerform()' w głównym wątku? – duemunk
Niepewny. To, co widzisz, to dosłownie cały kod źródłowy. Tak jak w przypadku, stworzyłem aplikację konsolową Swift, która jest treścią pliku Program.swift. Czy domyślnie klasa DispatchQueue działa w głównym wątku? – Charles
Powinien być wywoływany w wątku innym niż główny. Nie znalazłem dla niej żadnej dokumentacji, ale mam przetestowany kod, który działa tak, jak bym się spodziewał. https://github.com/duemunk/Async/blob/master/Source/Async.swift#L538-L540 – duemunk