2016-10-04 1 views
5

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?

+0

Est-ce que vous appelez 'concurrentPerform()' sur le thread principal? – duemunk

+0

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

+2

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

Répondre

0

bâtiment sur le commentaire de duemunk, voici comment j'appliquer une fonction performFunction en parallèle sur une file d'attente d'arrière-plan:

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