2017-02-09 13 views
0

私はいくつかの非同期処理を処理するいくつかの操作サブクラスを実装し始めました。キューを管理するためのベストプラクティス、特に同じタスクを2回追加しないことを確認することに興味があります。操作キュー内での操作のトラッキング

名前を付けてキューに操作を追加することはできますか、それとも辞書を作成して管理するのですか?キューに項目が追加されると、辞書に項目を追加し、終了したら辞書から項目を削除します。事前に条件チェックを行っていますか?

これは、操作サブクラス内に通知ブロックがあるので、非常に簡単に実現できます。ちょっとハッキリしているようです。

ありがとうございました。

---- EDIT ----

だからアイテムがキューにある場合、活動の指標を表示するために他の場所でループ(cellForItemAt)のためにこれを使用してみましたが、それが唯一のキューの最初の項目をチェックしているようだと、

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

がキューに操作を追加するときに同じことをやっているようだ。ユニークな名前を持つキュー内に複数の操作がある場合でも、ノー他人しかし、それを返します。最初の操作をチェックします。 != opNameの場合、opNameが存在する場合でも操作は追加されますが、最初の項目ではありません。

+0

uのために使用できます。 – vaibby

答えて

1

操作名を使用してこれを行うことができます。

let yourOperationQueue = NSOperationQueue() 

操作を追加するたびに操作名を設定し、操作を追加するたびにその名前でチェックします。これらの操作名は一意にしてください。

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

これはある点に作用します。最初の操作が!= opNameであればループして、それ以外の場合はキューに2番目の操作を追加してもそれをキューに追加します。== opName – Pippo

+0

'forOperartionQueue.operations'一意の名前を持つキューに複数のキューがあっても、最初の操作。 – Pippo

+0

はい、私はそれを逃した。コードを更新しました@Pippo – raki