2017-02-09 2 views
0

저는 일부 다운로드 작업과 같은 비동기 작업을 처리하는 일부 작업 하위 클래스를 구현하기 시작했습니다. 큐 관리에 대한 모범 사례에 대해 궁금합니다. 특히 동일한 작업을 두 번 추가하지 않도록하십시오.작업 대기열에서 작업 추적

작업 이름을 큐에 추가하거나 사전을 만들고 관리하는 경우가 있을까요? 예, 항목이 큐에 추가되면 항목을 사전에 추가하고 완료되면 사전에서 항목을 제거합니까? 미리 조건부 검사를 수행합니까?

작업 하위 클래스 내에 알림 블록이 있으므로 쉽게 구현할 수 있습니다. 그것은 단지 약간 해키처럼 보인다.

고마워.

---- 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이라면 루핑하여 다른 것으로 이동하여 대기열의 두 번째 연산을 생각해도 큐에 추가합니다. == opName – Pippo

+0

'forOpeartionQueue.operations'에서 'for operation in' 고유 한 이름을 가진 큐에 여러 개의 큐가있는 경우에도 첫 번째 작업. – Pippo

+0

예, 나는 그것을 놓쳤습니다. 코드를 업데이트했습니다. @Pippo – raki

관련 문제