2017-02-09 103 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