2017-02-09 144 views
0

我剛剛開始實現一些操作子類',它處理一些異步工作,比如爲我下載。我很好奇管理隊列的最佳做法,特別是確保我不會兩次添加相同的任務。操作隊列中的跟蹤操作

有沒有一種方法可以將操作添加到具有名稱的隊列中,還是創建和管理字典的一種方法?說,當項目被添加到隊列中時,您將條目添加到字典中,當它們完成時,您從字典中刪除條目?事先進行條件檢查?

由於操作子類中有一個通知塊,因此可以非常容易地實現。這似乎有點哈克。

感謝您的諮詢。

---- ----編輯

使用該for循環的其他地方(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

你可以用它來做那件事。 – 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那麼它會轉到else並將它添加到隊列中,即使認爲隊列中的第二個操作== opName – Pippo

+0

如果使用'for yourOpeartionQueue.operations中的操作',它似乎只是檢查即使隊列中有多個具有唯一名稱的第一個操作。 – Pippo

+0

是的,我錯過了。現在更新代碼@Pippo – raki