如何将带有块的ASIHTTPRequest合并到GCD并发队列中
目前我正在使用这种方式。我不想比较GCD队列和ASINetworkQueue。在这里,我正在使用GCD队列,并想知道我正在做正确的
NSString *urlString = [NSString stringWithFormat:@"http://mysite.com/news_detail/",tagID];
NSURL *url = [NSURL URLWithString:urlString];
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request setCachePolicy:ASIAskServerIfModifiedWhenStaleCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setDelegate:self];
[request setCompletionBlock:^{
dispatch_queue_t JSONProcessingQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(JSONProcessingQueue, ^{
dispatch_sync(JSONProcessingQueue, ^{
NSData *responseData = [request responseData];
[self processData:responseData];
});
dispatch_sync(dispatch_get_main_queue(), ^{
[self DisplayNews];
});
});
}];
[request setFailedBlock:^{
NSError *error = [request error];
NSLog(@"Error in downloading : %@", error.localizedDescription);
}];
[request startAsynchronous];
答案 0 :(得分:0)
我认为我的回答会对您的问题有所帮助 - Here i am trying to call my ASIHTTP request in a GCD . But Completion block and failed blocks are not executing
简而言之 - 不要使用GCD。使用ASINetworkQueue。
修改强>
Jonathan,我没有比较。您当前的解决方案是错误的。
您现在正在做的是启动异步请求,这是在不同线程上执行的操作。在将在相同的不同线程上执行的完成/错误块中,您要求一些全局队列(即线程),并将所有操作移动到它。
问题在于GCD不是神奇的,只是非常成功的线程化。它假定它从主线程开始,并在线程之间来回移动。
如果你真的很想学习,那么我对你使用GCD的想法是:
我假设您正在尝试获取数据,解析数据并使用DisplayNews方法更新GUI。如果是这样,并且还假设您必须使用全局队列而不是创建自己的队列,那么您应该这样做:
dispatch_async(JSONProcessingQueue, ^{
NSData *responseData = [request responseData];
[self processData:responseData];
dispatch_sync(dispatch_get_main_queue(), ^{
[self DisplayNews];
});
});