En testant mon code sous Sierra, j'ai trouvé que les méthodes qui géraient auparavant les files d'attente concurrentes ne fonctionnaient plus. En analysant l'erreur dans ma base de code C++, l'un des utilisateurs a suggéré une solution de contournement qui impliquait de nommer explicitement une cible pour la déclaration de la file d'attente (voir ce message: C++11 app that uses dispatch_apply not working under Mac OS Sierra) qui semble avoir résolu le problème.Application Swift utilisant DispatchQueue.concurrentPerform (les itérations :) ne s'exécutent plus simultanément sous Mac OS Sierra
Swift 3, le code suivant serait utilisé pour exécuter une fermeture en même temps, mais il expose un similaire, mais à l'exemple C de dans le poste ci-dessus:
import Foundation
import GameKit
DispatchQueue.concurrentPerform(iterations: 1000) { index in
let pauseTime = GKRandomSource.sharedRandom().nextInt(upperBound: 5)
sleep(UInt32(pauseTime))
print(index)
}
... Cependant, quand je l'exécuter, il exécute chaque bloc en série et les index sont sortis dans l'ordre numérique. Quelqu'un sait-il comment je pourrais tirer parti de la solution de contournement recommandée dans ce post pour résoudre mes problèmes de répartition «concurrents pour» dans Swift?
Est-ce que vous appelez 'concurrentPerform()' sur le thread principal? – duemunk
Incertain. Ce que vous voyez là est littéralement le code source entier. Comme dans, j'ai créé une application de console Swift, et c'est le corps de mon fichier Program.swift. Est-ce par défaut que la classe DispatchQueue s'exécute sur le thread principal? – Charles
Il doit être appelé sur un thread non principal. Je n'ai trouvé aucune documentation à ce sujet, mais j'ai un code bien testé qui fonctionne comme je m'y attendais. https://github.com/duemunk/Async/blob/master/Source/Async.swift#L538-L540 – duemunk