【问题标题】:Tracking operations in operation queue跟踪操作队列中的操作
【发布时间】:2017-02-09 05:11:18
【问题描述】:

我刚刚开始实现一些操作子类,它为我处理一些异步工作,比如下载。我很好奇管理队列的最佳实践,特别是要确保我不会两次添加相同的任务。

有没有一种方法可以将操作添加到带有名称的队列中,或者是否可以创建和管理字典?比如说,当项目被添加到队列中时,您将条目附加到字典中,当它们完成时,您从字典中删除条目?事先进行条件检查?

这很容易实现,因为操作子类中有一个通知块。只是看起来有点hacky。

感谢您的建议。

---- 编辑----

因此尝试在其他地方使用此 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 存在于队列中但不是第一项,它也会添加操作。

【问题讨论】:

  • 你可以用 for in 来做。

标签: ios swift nsoperationqueue


【解决方案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")
}

【讨论】:

  • 这很有效。如果第一个操作 != opName 循环,那么它会转到 else 并将其添加到队列中,即使队列中的第二个操作 == opName
  • 类似如果使用'for operation in yourOpeartionQueue.operations',它似乎只检查第一个操作,即使队列中有多个具有唯一名称的操作。
  • 不错的一个。怎么样!在 if !operationExist { ?? 中工作
  • 它的逻辑非运算符,你知道它反转了布尔值
猜你喜欢
  • 2015-02-09
  • 2019-11-18
  • 2015-09-20
  • 2012-12-23
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多