如何将带有块的ASIHTTPRequest合并到GCD并发队列中

时间:2011-11-20 11:45:41

标签: ios ios4 ios5

如何将带有块的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]; 

1 个答案:

答案 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];
        });       

    });