2013-09-30 2 views
0

다음 코드는 인터넷을 통해 데이터를 가져올 수 유효 :AFNetworking 2.0 라이브러리를 동 기적으로 사용하는 방법은 무엇입니까? AFNetworking 2.0을 사용

NSString *URLPath = @"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json"; 
NSDictionary *parameters = nil; 

[[AFHTTPRequestOperationManager manager] GET:URLPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"success: %@", responseObject); 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"failure: %@", error); 
}]; 

하지만 단위 테스트에 동 기적으로 이러한 요청을 테스트 할 수 있습니다.

// This code would be blocked. 
dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

NSString *URLPath = @"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json"; 
NSDictionary *parameters = nil; 

[[AFHTTPRequestOperationManager manager] GET:URLPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"success: %@", responseObject); 
    dispatch_semaphore_signal(sema); 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"failure: %@", error); 
    dispatch_semaphore_signal(sema); 

}]; 

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
dispatch_release_ARC_compatible(sema); 

어떻게 동기 AFNetworking 2.0 라이브러리를 사용하여 데이터를 가져올 수 있습니다 (Kiwi에서 그 코드를 테스트) :이 같은 GCD 세마포어를 사용하는 경우 그러나 그것은 차단 될 것인가?

+0

왜 당신은 사용할 수 없습니다 세마포어? –

+0

먼저, 테스트중인 코드를 생각해보십시오. 실제로 AFNetworking의 단위 테스트를 작성하고 싶습니까? 그들은 이미 자신의 것을 가지고 있습니다. 그렇다면 이걸 가지고 무엇을 시험하려고합니까? –

+0

다른 웹 API를 테스트하고 싶습니다. –

답변

1

기본적으로 AFNetworking이 주 루프에서 실행되기 때문에 사용자의 세마포가 차단됩니다. 따라서 세마포어의 주 루프를 기다리는 중이면 AFNetworking의 코드가 실행되지 않습니다.

이 문제를 해결하려면 AFnetworking에 다른 디스패치 대기열을 사용하기 만하면됩니다. 당신은 할 수 있도록처럼 미리 정의 된 것들의

당신은 당신의 자신의 파견 큐를 만들거나 사용할 수있는 하나의 AFHTTPRequestOperationManageroperationQueue 속성을 설정하여 :

// Make sure that the callbacks are not called from the main queue, otherwise we would deadlock 
manager.operationQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
+0

이것이 작동하지 않을 것입니다.'''dispatch_get_global_queue'''는 NSOperationQueue – dwery

+0

을 @dwery 나쁜 것으로 반환하지 않습니다. 더 이상 코드가 없으므로 정확히 무엇을했는지 볼 수는 없지만 NSOperationQueue를 얻는 것은 너무 어렵지 않습니다. – gregschlom