0

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 (그룹)와 일치시킵니다. 완료 블록의 끝에서 작동합니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?

답변

1

현재 MKNetworkKit은 대기열 완료 핸들러를 지원하지 않습니다. 이 해킹 대신 작업 종속성을 추가하는 것을 고려해야합니다.

[lastOperation addDependency:op1]; 
[lastOperation addDependency:op2]; 

"lastOperation"이 완료되면 실제로 대기열이 완료된 것으로 가정합니다.

또 다른 방법은 엔진의 "operationCount"키 경로를 KVO로 설정하고 엔진이 제로에 도달하는지 확인하는 것입니다.

MKNetworkEngine에는 네트워크 활동 표시기를 표시하거나 숨기는 코드 블록이 있습니다.

+0

나는 그것을 시도 할 것이다, 고마워! –