2011-11-20 39 views
0

如何与块结合ASIHTTPRequest到GCD并发队列我怎样才能纳入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

不要这样。你正在执行线程的线程化。你的实际需求是什么? – nadavhart

回答

0

我想,我的回答将您的问题帮助 - Here i am trying to call my ASIHTTP request in a GCD . But Completion block and failed blocks are not executing

总之 - 不使用GCD。使用ASINetworkQueue。

编辑:

乔纳森,我是不是比较。你目前的解决方案是不正确的。

你现在正在做什么,正在开始一个异步请求,这是一个在不同线程上执行的操作。在将在同一个不同线程上执行的完成/错误块中,您需要一些全局队列(即线程),并将所有操作移至该队列。

问题是GCD并不神奇,只是一个非常成功的线程化模糊。它假设它从主线程开始,并在线程之间来回移动。

如果你对学习困难的方式真的弯曲,那么这里是我对你的GCD的使用感想:

我假设你正在试图获得的数据,分析它,并使用更新GUI DisplayNews方法。如果是这样,还假设你必须使用全局队列,而不是创建自己的队列,这是你应该怎么做:

dispatch_async(JSONProcessingQueue, ^{ 

     NSData *responseData = [request responseData]; 
     [self processData:responseData]; 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [self DisplayNews]; 
     });  

    }); 
+0

我不想比较GCD队列和ASINetworkQueue。在这里,我正在使用GCD队列,并想知道我做的是否正确。检查我编辑的问题 –

+0

现在感谢我得到了我的prblm。所以我可以从我的代码中省略GCD。当我使用Asyncronous时,它在后台线程上运行..好吧? –

+0

我的NewsParser类中的所有代码。所以我可以调用这样的方法NewsParser * newsParser = [[NewsParser alloc] init]; [newsParser getNews]; [newsParser发布]; –