2017-10-18 18 views
2

aufgerufen Ich habe eine asynchrone Aufgabe o führen Sie die Berechnung und die Animation, während die Animation beginnt, die Warteschlange aussetzt, wenn die Animation beendet ist, wird die Warteschlange wieder aufgenommen. Aber aus irgendeinem Grund wird die DispatchQueue.main.sync nie aufgerufen.DispatchQueue main wird nicht

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() 
     } 
    } 

Dies ist nur kleine Rechnung, werde ich das verwenden, um Aufgaben komplexer zu lösen als das

+0

Ich sehe keine * async * Aufgabe. 'mainAsyncQueue' ist eigentlich' backgroundSyncQueue';) – vadian

+1

Ok Variablenname Nazi: P Ändern – RodolfoAntonici

Antwort

3

ich diesen Code übernehmen im Hauptthread ist.

Wenn ja, haben Sie mit einem Hintergrund-Thread synchronisiert und von dort versucht, wieder auf DispatchQueue.main zu synchronisieren. Aber diese Warteschlange wartet darauf, dass der Hintergrund zurückkehrt, bevor sie etwas tun kann.

0

Dank Lou Franco Antwort habe ich einige Änderungen:

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() 
       } 
      } 
     } 
Verwandte Themen