簡體   English   中英

跟蹤操作隊列中的操作

[英]Tracking operations in operation queue

我剛剛開始實現一些Operation Subclass,它可以處理一些異步工作,例如為我下載。 我對管理隊列的最佳做法感到好奇,特別是要確保我不會兩次添加相同的任務。

有沒有一種方法可以將操作添加到具有名稱的隊列中,或者是創建和管理字典的情況? 說,當項目添加到隊列中時,您將條目追加到詞典中,完成后您將條目從詞典中刪除? 事先執行條件檢查?

這很容易實現,因為操作子類中有一個通知塊。 似乎有點不客氣。

謝謝你的建議。

----編輯----

因此嘗試在其他地方使用此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而不是第一項,它將添加操作。

您可以使用操作名稱來執行此操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM