2017-02-09 1 views
0

Ich habe gerade angefangen, einige Operation Subclass 'zu implementieren, die einige async Arbeit wie das Herunterladen für mich handhaben. Ich bin neugierig auf Best Practice für die Verwaltung der Warteschlange, insbesondere um sicherzustellen, dass ich nicht die gleiche Aufgabe zweimal hinzufügen.Verfolgungsoperationen in der Betriebswarteschlange

Gibt es eine Methode, bei der ich die Operation mit einem Namen zur Warteschlange hinzufügen kann oder ein Wörterbuch erstellt und verwaltet? Angenommen, wenn Elemente zur Warteschlange hinzugefügt werden, fügen Sie einen Eintrag zum Wörterbuch hinzu und wenn sie fertig sind, entfernen Sie den Eintrag aus dem Wörterbuch? Conditional Check vorab durchführen?

Dies könnte ziemlich leicht erreicht werden, da es einen Benachrichtigungsblock innerhalb der Operationsunterklasse gibt. Es scheint nur ein bisschen hacky.

Danke für den Rat.

---- ---- EDIT

versucht Also das mit anderweitig Schleife (cellForItemAt) Aktivitätsindikator zu zeigen, wenn das Element in der Warteschlange ist, aber es scheint nur das erste Element der Warteschlange werden überprüft und Rückkehr, dass aber keine anderen, auch wenn es mehrere Operationen in der Warteschlange mit eindeutigen Namen sind:

  for operation in downloadQueue.operations { 
       if operation.name == self.multiPartArray[collectionView.tag][indexPath.item].name {      innerCell.contentView.addSubview(self.activityIndicatorView)      self.activityIndicatorView.centerXAnchor.constraint(equalTo: innerCell.contentView.centerXAnchor).isActive = true      self.activityIndicatorView.centerYAnchor.constraint(equalTo: innerCell.contentView.centerYAnchor).isActive = true 
        self.activityIndicatorView.isHidden = false 
        self.activityIndicatorView.startAnimating() 
        innerCell.contentView.bringSubview(toFront: self.activityIndicatorView) 
        break 
       } else { 
        print("Operation not in queue") 
       } 
      } 

scheint das gleiche tun, wenn Operationen in die Warteschlange hinzufügen. Es prüft die erste Operation. Wenn! = OpName, wird die Operation hinzugefügt, auch wenn opName in der Warteschlange vorhanden ist, aber nicht das erste Element.

+0

können Sie dafür verwenden. – vaibby

Antwort

1

Sie können dazu den Operationsnamen verwenden.

let yourOperationQueue = NSOperationQueue() 

Legen Sie den Operationsnamen jedes Mal fest, wenn Sie eine Operation hinzufügen und überprüfen Sie diesen Namen jedes Mal, bevor Sie die Operation hinzufügen. Halten Sie diese Vorgangsnamen eindeutig.

func addDownloadOperation() 
{ 
    self.checkAndAddOperationWithName("DownloadOperation") 
} 

func addUploadOperation() 
{ 
    self.checkAndAddOperationWithName("UploadOperation") 
} 

func checkAndAddOperationWithName(opName:String) 
{ 
    var operationExist = false 
    for operation in yourOpeartionQueue.operations 
    { 
     if operation.name == opName 
     { 
      print("Operation alreday added") 
      operationExist = true 
      break 
     } 
    } 
    if !operationExist 
    { 
     self.addOperationToTheQueWithName(opName) 
    } 
} 

func addOperationToTheQueWithName(opName:String) 
{ 
    let someOperation = NSBlockOperation(block:{ 
     //some heavy operations 
    }) 
    someOperation.name = opName 
    yourOpeartionQueue.addOperation(someOperation) 
    print("Operation \(opName) added") 
} 
+0

Das funktioniert bis zu einem gewissen Punkt. Wie es durchläuft, wenn die erste Operation! = OpName, dann geht es zu else und fügt es in die Warteschlange sogar die zweite Operation in der Warteschlange == opName – Pippo

+0

Ähnlich, wenn 'für die Operation in IhremOpeartionQueue.Operations' zu verwenden scheint es nur zu überprüfen die erste Operation, auch wenn mehrere in der Warteschlange mit eindeutigen Namen sind. – Pippo

+0

Ja, das habe ich verpasst. Jetzt aktualisiert den Code @Pippo – raki

Verwandte Themen