2012-07-10 3 views
3

NSOperationQueueNSOperations이 추가되었습니다. 작업 대기열은 maxConcurrentOperationCount이 1로 설정되어 있으므로 NSOperations이 차례대로 실행됩니다. 나는 NSOperationQueuecancelAllOperations를 호출하여 보류중인 모든 NSOperations을 취소하려는 NSOperationcompletionBlock에서 지금 NSOperations와 완료 블록이 동시에 실행됩니까?

.

안전한가요? 이전 작업의 completionBlock이 완전히 실행 된 후에 만 ​​다음 작업의 start- 메서드가 호출되는지 확인할 수 있습니까? 또는 이전 작업의 completionBlock과 현재 작업의 작업이 동시에 실행됩니까?

내가 묻는 이유 : AFNetworking을 사용하여 AFHTTPRequestOperations의 배치를 실행하고 이전 배치 요청이 모두 성공한 경우에만 하나의 요청을 수행하려고합니다.

답변

4

내 결과는 더 이상 사실로 보지 않습니다. iOS 8 및 iOS 9에서 테스트를 다시 실행했으며 작업 완료 블록은 항상 다음 작업과 동시에 실행됩니다. 현재, 이전 완료 블록이 완료 될 때까지 작업을 대기시키는 방법이 표시되지 않습니다.


예제 프로젝트에서이 시나리오를 시도해 보았습니다.

NSOperationQueuemaxConcurrentOperationCount을 1로 설정, NSOperationcompletionBlock 큐 실행에서 다음 NSOperation 동시에하는 경우 : 다음은 결과입니다.

그러나 NSOperation이 모두 이전 작업에 연결되어있는 경우 addDependency:을 호출하면 이전 작업의 completionBlock이 완료 될 때까지 작업 실행이 대기합니다.

그래서, 당신은 현재 작업의 completionBlock의 다음 작업을 취소하고

+0

다양한 분석 addDependency:를 호출하여이가 시작되기 전에, 당신은 NSOperations 간의 종속성을 설정할 필요가 취소되어 있는지 확인하려면! 지금도 같은 것을 경험했습니다. – Klaas

+0

적어도 iOS 9에는 맞지 않습니다. 종속 작업을 취소 할 수있는 완료 블록이 있지만 완료 블록이 실행되기 전에 일반적으로 이미 실행되기 시작했습니다. – Accatyyc

+0

맞습니다. 실험을 다시 실행 했으므로 이제 완성 블록과 다음 작업이 항상 병렬로 실행됩니다. – Tom

관련 문제