2016-10-04 32 views
5

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?

+0

Czy zadzwonić 'concurrentPerform()' w głównym wątku? – duemunk

+0

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

+2

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

Odpowiedz

0

Opierając się na komentarzu duemunk, oto jak ja zastosować funkcję performFunction równolegle w kolejce tle:

let queue = DispatchQueue(label: "myQueue", qos: .userInteractive, attributes: .concurrent) 
    queue.async { 
     DispatchQueue.concurrentPerform(iterations: iterations) { 
      index in 
      performOperation(index) 
     } 
    }