Управление двумя NSURLConnection - PullRequest
       4

Управление двумя NSURLConnection

1 голос
/ 17 сентября 2011

Я хочу сделать два асинхронных запроса из двух разных файлов kml, поэтому сначала я устанавливаю два запроса:

NSString *server1URL = [NSString stringWithFormat:...];
NSMutableURLRequest *firstRequest =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:server1URL]];
[firstRequest setHTTPMethod:@"GET"];
NSURLConnection *AConnection = [NSURLConnection connectionWithRequest:firstRequest delegate:self];

NSString *server2URL = [NSString stringWithFormat:...];
NSMutableURLRequest *secondRequest =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:server2URL]];
[secondRequest setHTTPMethod:@"GET"];
NSURLConnection *BConnection = [NSURLConnection connectionWithRequest:secondRequest delegate:self];

Затем я инициализирую NSMutableData Я буду использовать:

AResponseData = [[NSMutableData alloc] init];
BResponseData = [[NSMutableData alloc] init];

Затем я ссылаюсь на этот пост и сделал это:

connectionToInfoMapping = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionaryAddValue(connectionToInfoMapping, AConnection, [NSMutableDictionary dictionaryWithObject:AResponseData forKey:@"receivedData"]);
CFDictionaryAddValue(connectionToInfoMapping, BConnection, [NSMutableDictionary dictionaryWithObject:BResponseData forKey:@"receivedData"]);

ОК, тогда есть делегаты:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    const NSMutableDictionary *connectionInfo = CFDictionaryGetValue(connectionToInfoMapping, connection);
    [[connectionInfo objectForKey:@"receivedData"] appendData:data];
}

Так что с этим я могу получитьданные присоединяются к правильному NSMutableData, который соответствует соединению.

Теперь в - (void)connectionDidFinishLoading:(NSURLConnection *)connection я хочу «Если А завершит, сделайте это, если Б завершите, сделайте это», и мой вопрос, как я могусделать это?

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    if( [connection isEqual: AConnection] ){
        // do connection A stuff
    }
    else if( [connection isEqual: BConnection] ){
        // do connection B stuff
    }  
}
0 голосов
/ 17 сентября 2011

Использовать GCD с sendSynchronousRequest: запросы будут выполняться в фоновом режиме.

Пример:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{
    NSURLRequest *request = [NSURLRequest requestWithURL:url1];
    NSURLResponse *response;
    NSError *error;
    NSData *data1 = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    // do something with the data
});

dispatch_async(queue, ^{
    NSURLRequest *request = [NSURLRequest requestWithURL:url2];
    NSURLResponse *response;
    NSError *error;
    NSData *data2 = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    // do something with the data
});
0 голосов
/ 17 сентября 2011

Как насчет назначения тегов каждому соединению и проверки тегов с помощью if / else или переключателя в connectionDidFinishLoading?

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