2014-09-17 1 views
0

을 필요로있을 때 dispatch_async 조치를 취소하지 나는 내가해야 할 것은 내가이의 ViewController를 팝업 할 때 getItems을 중지하는 것입니다 viewDidLoad더 이상

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    items = [[DataFetcher sharedInstance] getItems handler:^(NSArray *currentItems){ 
     if (currentItems.count % 30 == 0) { //don't wait for all the items to be ready show by chunks of 30 
      items = currentItems; 
      [tableView reloadData]; 
     } 
     items = currentItems; 
    }];//Pretty complex call that takes some time to finish there is WebService calls, data parsing, storing some results ... 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [tableView reloadData]; 
    }); 
}); 

에서 다음을 수행하는 UIViewController 있습니다. 그것은 무의미하며 CPU 시간과 에너지를 필요로합니다 (이 호출은 경우에 따라 최대 1 분이 소요될 수 있습니다).

내가 정확히 viewWillDisappear에서 이렇게해야한다고 가정합니다.

답변

1

NSBlockOperation을 사용할 수 있습니다. 정기적으로이 취소 됐어요 있는지 확인하고이 있었는지 일을 중지합니다

- (void)getItemsWithHandler:(void (^)(NSArray *currentItems))handler { 
    self.operation = [NSBlockOperation blockOperationWithBlock:^{ 
     if (self.operation.isCancelled) { 
      return; 
     } 

     // Do something expensive 

     if (self.operation.isCancelled) { 
      return; 
     } 

     // Do something else expensive 

     for (int i = 0; i < 10000; i++) { 
      if (self.operation.isCancelled) { 
       return; 
      } 

      // Do expensive things in a loop 
     } 
    }]; 
} 

- (void) cancelGetItemsRequest { 
    [self.operation cancel]; 
    self.operation = nil; 
} 

또는, 당신은 NSOperationQueueNSBlockOperation의 한 무리를 넣을 수 있습니다. 원하는 경우 작업에 대한 종속성을 설정하고 전체 큐를 한 번에 취소 할 수 있습니다.

+2

'self'가 소유 한 작업에서 'self'를 강력하게 캡처하면 유지주기가 만들어집니다. 이 예제는 취소 사례의 종속성을 지우지 만 성공적인 완료 사례의 종속성은 지 웁니다. – ipmcc

+1

그래, 내가 언급 했어야 했어. 그것을 지적 주셔서 감사합니다. [이 질문에 대한 자세한 내용은] (http://stackoverflow.com/q/8113268/1445366)을 참조하십시오. –

0

비동기 작업 취소는 NSOperation 및 NSOperationQueue에서 지원되지만 상당히 복잡합니다. 어쨌든 비동기 코드는 때때로 취소되었는지 또는 계속해야하는지 여부를 확인해야합니다.

가장 좋은 방법은 어딘가에 "취소 된"속성을 갖는 것이며, 더 이상 작업을하지 않으려는 경우 설정하고 더 많은 작업을 할 때마다 해당 속성을 확인하는 것입니다.

+0

[NSBlockOperation] (https://developer.apple.com/library/mac/documentation/cocoa/reference/NSBlockOperation_class/Reference/Reference.html)을 사용하면 실제로는 * 덜 복잡해집니다. –

+0

(작업 대기열을 필요로하지 않으며 이미 취소 된 속성이 있습니다.) –