1

많은 시간과 리소스가 필요한 이미지 처리가 있으므로 콜백에 NSOperation + NSOperatioQueue + 대리자를 사용합니다. 그리고 모든 일.완료 블록이있는 NSOperation

이제 블록을 사용하고 싶습니다. 예를 들어 tableView에서 사용하기에 훨씬 우아하고 단순하기 때문입니다.

내가 뭘해야 단지 예를 들어 AFJSONRequestOperation 같다 : 내가 어떤 operationQueue 표시되지 않는이 예에서는

NSURL *url = [NSURL URLWithString:@"url"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
NSLog(@"App.net Global Stream: %@", JSON); 
} failure:nil]; 
[operation start]; 

! 내가 어떻게 할 수 있니?

[ImageManagerOperation modifyImage:(UIImage*)image completitionBlock:(void (^)(UIImage *modifiedImage))complete]; 

여기서 ImageManagerOperation은 NSOperation입니다.

완료 블록을 설정할 수 있다는 것을 알고 있지만 큐에 작업을 추가해야합니다.

내 코드의 행 번호를 최소화하고 싶습니다 (가능한 경우 :).).

답변

1

일반적으로 NSOperation의 코드는 동기식입니다. NSOperationQueue은 백그라운드에서 코드를 실행하는 데 필요한 스레드를 제공합니다. 따라서 작업을 대기열에 추가하면 대기열이 백그라운드 스레드에서 작업 할 때 start을 호출합니다.

AFJSONRequestOperation은 이라고하는 특별한 유형의 NSOperation입니다. 즉,이 작업은 이미 내부적으로 자체 백그라운드 스레드를 제공합니다. 경우에 따라 concurrent 메서드를 호출 외부에서 호출 할 수 있습니다. 작업은 이미 자신의 백그라운드 스레드를 제공하기 때문에 백그라운드에서 계속 실행됩니다. 이 경우 start은 예제에 표시된 코드를 최소화하기 위해 직접 호출 될 수 있습니다. 대기열이 dependanciesmaxConcurrentOperationCount 관리 등 제공하는 다른 것들의 장점을 원하기 때문에

는 일반적으로 당신은 여전히 ​​ NSOperationQueueconcurrent 작업을 추가합니다.

자신을 NSOperationQueue으로 만들고 작업을 추가하십시오. start에 전화 할 필요가 없으므로 대기열에서 처리합니다.

+0

감사합니다. 그래서 결국 내 자신의 대기열을 만들어야합니다. 이건 tableView에 대한 것이기 때문에 많은 노력이 필요할 것입니다. GCD와 그 작업을 잘 처리하고 있습니다. 정말 감사합니다. –

+0

감사합니다. 결국 나는 내 자신의 대기열을 만들어야하는데, tableView에 많은 것을 기울일 것이기 때문에 GCD와 그 작업을 잘 수행 할 것입니다. GCD는 작업을 올바르게 사용한다고 생각하십니까? 당신은 내 질문에 답해 주셔서 감사합니다. –

+0

아니요, NSOperation은 GCD를 다른 방법으로 사용하지 않습니다. 대기열이 필요한 것처럼 들리므로 테이블보기에서 수행하는 작업량을 제한 할 수 있습니다. 당신이 스크롤하는 동안 각 셀에 대한 작업을하고 있다고 가정합니다. 어떤 사람이 많이 스크롤하면 너무 많은 일을 시작할 수 있습니다. 대기열을 사용하면이를 제한하는 데 도움이되며 셀에서 시작되었을 수 있지만 더 이상 필요하지 않은 작업은 사용자가 스크롤하여 취소 할 수 있습니다. 이것을 깊이 논의하는 WWDC (2012 생각) 세션이 있습니다. 이것이 당신이하는 일이라면이 비디오를 찾아야합니다. –