Как я могу включить ASIHTTPRequest с блоками в параллельную очередь GCD - PullRequest
0 голосов
/ 20 ноября 2011

Как я могу включить ASIHTTPRequest с блоками в параллельную очередь GCD

В настоящее время я использую этот способ .Я не хочу сравнивать GCD Queues и ASINetworkQueue.Здесь я использую GCD Queues и хочу знать, правильно ли я делаю

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 голосов
/ 20 ноября 2011

Я думаю, что мой ответ поможет с вашей проблемой - Здесь я пытаюсь вызвать мой запрос ASIHTTP в GCD. Но блоки завершения и блоки с ошибками не выполняются

Короче - не используйте GCD. используйте ASINetworkQueue.

EDIT:

Джонатан, я не сравнивал. Ваше текущее решение просто неверно.

То, что вы сейчас делаете, запускает асинхронный запрос, который является операцией, выполняемой в другом потоке. В блоках завершения / ошибки, которые будут выполняться в одном и том же потоке, вы запрашиваете некоторую глобальную очередь (то есть поток) и перемещаете в нее все операции.

Проблема в том, что GCD - это не волшебство, а очень удачная неоднозначность потоков. Предполагается, что он запускается в главном потоке и перемещается назад и вперед между потоками.

Если вы действительно хотите освоить трудный путь, то вот мои мысли о том, как вы используете GCD:

Я предполагаю, что вы пытаетесь получить данные, проанализировать их и обновить графический интерфейс, используя метод DisplayNews. если это так, а также при условии, что вы должны использовать глобальную очередь, а не создавать собственную очередь, это то, как вы должны это сделать:

    dispatch_async(JSONProcessingQueue, ^{

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

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

    }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...