2013-09-30 40 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

我想测试其他提供的Web API。 –

回答

1

您的信号量将被阻止,因为默认情况下AFNetworking在主循环上运行。所以如果你在等待信号量的主循环,AFNetworking的代码永远不会运行。

为了解决这个问题,你只需告诉AFNetworking使用不同的调度队列。你这样做,通过设置AFHTTPRequestOperationManager

您可以创建自己的调度队列,或使用预定义者之一的operationQueue财产,像这样:

// 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