2017-12-11 2 views
-1

ich ein Problem habe, wo ich eine Statusleiste Animation auf Haupt laufen habe durch Synchronisierung unterbrochen werden Anrufe an meine Serien Queue.Serielle Queue-Sync-Verfahren zu unterbrechen UIView Animation auf dem Main

Bisher habe ich diese Warteschlange nicht als serielle Warteschlange und nur als asynchrone Warteschlange verwendet - dies führte jedoch zu Problemen bei der Eingabe von Hintergrund-/Vordergrundübergängen und ich musste die Warteschlange als synchron behandeln und nur sync aufrufen von async darauf.

Jetzt fließt die Warteschlange meine Anwendung funktioniert reibungslos - mit Ausnahme der UIView-Animation stottert jetzt (manchmal für mehr als eine Sekunde) abhängig von der Belastung jedes Sync-Aufrufs zu meiner seriellen Warteschlange.

Gibt es trotzdem sync Anrufe an meine Serien Warteschlange zu ermöglichen, ohne diese stottert in meiner UIView Animation verursacht? Ich habe versucht, dynamisch eine neue Animation in jedem Synchronisierungsblock zu meiner seriellen Warteschlange aufzurufen, aber das behebt das Problem nicht.

Antwort

0

Bitte versuchen Sie es unten Dinge:

  1. NSOperationQueue erstellen. Stellen Sie max gleichzeitige Aufgabe 1. Es wird serielle Warteschlange Muster ausführen
  2. NSOperation Subklasse erstellen (Angenommen CustomOperation) und den gewünschten Code in main-Methode schreiben. Sobald Auftrag abgeschlossen Trigger-Finish und Schalter auf Hauptthread und tun Fortschrittsbalken Update Dinge oder andere
  3. erstellen Objekt (e) von CustomOperation und alle von ihnen gewünschten 1-Warteschlange CustomOperation

Klasse zu Schritt: Operation {

var identifier:String? 
var index:Int? 

override func main() { 
    /// do sync or async tasks 

    //// post completion tasks 

    NotificationCenter.default.post(name: NSNotification.Name("TASKDONE"), object: self) 
} 

}

func addOperations() {

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.trackOperation(operation:)), name: NSNotification.Name(rawValue: "TASKDONE"), object: nil) 

let operationQueue = OperationQueue() 
var items = [CustomOperation]() 
for index in 0..<10 { 
    let operation = CustomOperation() 
    operation.index = index 
    operation.name = "Operation:\(index)" 
    items.append(operation) 
} 
operationQueue.maxConcurrentOperationCount = 1 
operationQueue.addOperations(items, waitUntilFinished: false) 

}