Управление несколькими асинхронными подключениями NSURLConnection

88
задан iDeveloper 4 April 2016 в 12:58
поделиться

8 ответов

Я отслеживаю ответы в CFMutableDictionaryRef, включенном NSURLConnection, связанным с ним. т.е.:

connectionToInfoMapping =
    CFDictionaryCreateMutable(
        kCFAllocatorDefault,
        0,
        &kCFTypeDictionaryKeyCallBacks,
        &kCFTypeDictionaryValueCallBacks);

Это может казаться нечетным для использования этого вместо NSMutableDictionary, но я делаю это, потому что этот CFDictionary только сохраняет свои ключи (NSURLConnection), тогда как NSDictionary копирует свои ключи (и NSURLConnection не поддерживает копирование).

, Как только это сделано:

CFDictionaryAddValue(
    connectionToInfoMapping,
    connection,
    [NSMutableDictionary
        dictionaryWithObject:[NSMutableData data]
        forKey:@"receivedData"]);

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

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSMutableDictionary *connectionInfo =
        CFDictionaryGetValue(connectionToInfoMapping, connection);
    [[connectionInfo objectForKey:@"receivedData"] appendData:data];
}
77
ответ дан Matt Gallagher 24 November 2019 в 07:35
поделиться

Как указано другими ответами, необходимо сохранить connectionInfo где-нибудь и искать их соединением.

самый естественный тип данных для этого NSMutableDictionary, но он не может принять NSURLConnection как ключи, поскольку соединения не copyable.

Другая опция для использования NSURLConnections как ключи NSMutableDictionary использует NSValue valueWithNonretainedObject]:

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSValue *key = [NSValue valueWithNonretainedObject:aConnection]
/* store: */
[dict setObject:connInfo forKey:key];
/* lookup: */
[dict objectForKey:key];
1
ответ дан Community 24 November 2019 в 07:35
поделиться

Одна опция состоит в том, чтобы только разделить NSURLConnection на подклассы самостоятельно и добавить - тег или похожий метод. Дизайн NSURLConnection является намеренно очень скелетом, таким образом, это совершенно приемлемо.

Или возможно Вы могли создать класс MyURLConnectionController, который ответственен за создание и сбор данных соединения. Это должно было бы тогда только сообщить Вашему объекту основного контроллера, как только загрузка закончена.

2
ответ дан Mike Abdullah 24 November 2019 в 07:35
поделиться

Попробуйте мой пользовательский класс, MultipleDownload, который обрабатывает все они для Вас.

4
ответ дан leonho 24 November 2019 в 07:35
поделиться

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

5
ответ дан Brad The App Guy 24 November 2019 в 07:35
поделиться

Я обычно создаю массив словарей. Каждый словарь имеет немного информации об идентификации, объект NSMutableData сохранить ответ и само соединение. Когда метод делегата соединения стреляет, я ищу словарь соединения и обрабатываю его соответственно.

2
ответ дан Ben Gottlieb 24 November 2019 в 07:35
поделиться

Мне нравится ASIHTTPRequest .

1
ответ дан 24 November 2019 в 07:35
поделиться

ЭТО НЕ НОВЫЙ ОТВЕТ. ПОЖАЛУЙСТА, ПОЗВОЛЬТЕ МНЕ ПОКАЗАТЬ ВАМ, КАК Я СДЕЛАЛ

Чтобы различать разные NSURLConnection в методах делегата одного и того же класса, я использую NSMutableDictionary, чтобы устанавливать и удалять NSURLConnection, используя его описание (NSString *) в качестве ключа.

Объект, который я выбрал для setObject: forKey , является уникальным URL-адресом, который используется для инициирования NSURLRequest , используемого NSURLConnection .

После установки NSURLConnection оценивается по адресу

-(void)connectionDidFinishLoading:(NSURLConnection *)connection, it can be removed from the dictionary.

// This variable must be able to be referenced from - (void)connectionDidFinishLoading:(NSURLConnection *)connection
NSMutableDictionary *connDictGET = [[NSMutableDictionary alloc] init];
//...//

// You can use any object that can be referenced from - (void)connectionDidFinishLoading:(NSURLConnection *)connection
[connDictGET setObject:anyObjectThatCanBeReferencedFrom forKey:[aConnectionInstanceJustInitiated description]];
//...//

// At the delegate method, evaluate if the passed connection is the specific one which needs to be handled differently
if ([[connDictGET objectForKey:[connection description]] isEqual:anyObjectThatCanBeReferencedFrom]) {
// Do specific work for connection //

}
//...//

// When the connection is no longer needed, use (NSString *)description as key to remove object
[connDictGET removeObjectForKey:[connection description]];
8
ответ дан 24 November 2019 в 07:35
поделиться