MKNetworkKit을 사용하여 웹 서비스에서 링크 배열을 가져온 다음 백그라운드 스레드에서 각 응답을 구문 분석하고 GCD의 dispatch_group_t를 사용하여 모든 스레드가 처리를 완료 할 때까지 대기합니다. 내가 꼼짝 못하는 이유는 내 dispatch_group_notify가 그룹의 모든 스레드가 완료 될 때까지 기다리지 않는 이유를 알 수 없기 때문입니다. 이 코드를 실행하면 다음과 같이 인쇄됩니다.MKNetworkKit 및 GCD dispatch_group_t
results count: 0
added into results, count: 1
added into results, count: 2
발송 그룹이 스레드에서 대기하고 있지 않습니다. dispatch_group_wait도 시도했지만 충돌이 발생했습니다. MKNetworkKit의 NSOperation 사용이이 문제와 상충하는지 여부는 알 수 없습니다. 어떤 도움을 주셔서 감사합니다!
- (MKNetworkOperation *)getABunchOfMovies:(NSArray *)movies onCompletion:(CastResponseBlock)completionBlock onError:(MKNKErrorBlock)errorBlock
{
MKNetworkOperation *operation;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
block NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:[movies count]];
for (NSString *movieTitle in movies) {
operation = [self operationWithPath:REQUEST_URL(API_KEY, [movieTitle urlEncodedString])];
[operation onCompletion:^(MKNetworkOperation *completedOperation) {
dispatch_group_async(group, queue, ^{
NSDictionary *response = [completedOperation responseJSON];
id result = [self processResponse:response withMovieTitle:movieTitle];
@synchronized (results) {
[results addObject:result];
NSLog(@"added into results, count: %d", [results count]);
}
});
}
onError:^(NSError *error) {
errorBlock(error);
}];
[self enqueueOperation:operation];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"results count: %d", [results count]);
// Return array here
completionBlock(results);
});
dispatch_release(group);
return operation;
}
편집 : 는 아직도 이유를 알아낼 수 없습니다,하지만 난 변경하는 경우가 dispatch_group_enter (그룹)를 사용하는; dispatch_group_leave (그룹)와 일치시킵니다. 완료 블록의 끝에서 작동합니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?
나는 그것을 시도 할 것이다, 고마워! –