2017-10-18 4 views
2

J'ai une tâche asynchrone o effectuer le calcul et l'animation, lorsque l'animation commence, la file d'attente se suspend, lorsque l'animation se termine, la file d'attente est reprise. Mais pour une raison quelconque, le DispatchQueue.main.sync n'est jamais appelé.DispatchQueue main n'est pas appelée

self.someQueue = DispatchQueue(label: "Animation", qos: .background, attributes: DispatchQueue.Attributes.concurrent) 
    for index in stride(from: volumeObjects.count, to: -1, by: -1) { 
     mainAsyncQueue.sync{ 
      self.dynamicViewModel.currentPercentile = Float(index)/Float(volumeObjects.count) 
      self.currentObjectIndex = index 
      print(index) 

      DispatchQueue.main.sync { 
       UIView.animate(withDuration: 1, animations: { 
        self.updateViewModelDynamicViewModel() 
       }, completion: { (finished) in 
        self.someQueue.resume() 
       }) 
      } 
      self.someQueue.suspend() 
     } 
    } 

Ceci est juste petit calcul, je vais l'utiliser pour résoudre des tâches plus complexes que

+0

Je ne vois pas * * async tâche. 'mainAsyncQueue' est en fait' backgroundSyncQueue';) – vadian

+1

Ok nom de la variable Nazi: P Changer – RodolfoAntonici

Répondre

3

Je suppose que ce code est dans le thread principal.

Si tel est le cas, vous avez synchronisé avec un thread d'arrière-plan et de là, vous avez tenté de synchroniser à DispatchQueue.main. Mais cette file d'attente attend que l'arrière-plan retourne avant de pouvoir faire quoi que ce soit.

0

Merci à la réponse de Lou Franco je l'ai fait quelques changements:

DispatchQueue.global().async { 
      self.someQueue = DispatchQueue(label: "Animation", qos: .background, attributes: DispatchQueue.Attributes.concurrent) 
      for index in stride(from: volumeObjects.count, to: -1, by: -1) { 
       self.someQueue.sync{ 
        self.dynamicViewModel.currentPercentile = Float(index)/Float(volumeObjects.count) 
        self.currentObjectIndex = index 
        print(index) 

        DispatchQueue.main.sync { 
         UIView.animate(withDuration: 0.1, animations: { 
          self.updateViewModelDynamicViewModel() 
         }, completion: { (finished) in 
          if finished { 
           self.someQueue.resume() 
          } 
         }) 
        } 
        self.someQueue.suspend() 
       } 
      } 
     }