Использование нескольких NSURLConnections одновременно - лучшие практики - PullRequest
0 голосов
/ 07 ноября 2010

В своем приложении для iPhone я смог правильно использовать NSURLConnection для загрузки данных с URL. Я просто устанавливаю delegate для своего UIView и проверяю, что я настроил UIView для ответа на соответствующие функции делегата, такие как -connection:didReceiveResponse:. Однако, если у меня есть несколько NSURLConnections (либо для запроса аналогичного типа, либо для нескольких типов запросов), это может привести к путанице, поскольку функции делегатов, такие как didReceiveRequest, не различают разные запросы. Преимущество асинхронных запросов состоит в том, что вы должны иметь возможность выполнять множественное одновременное выполнение без блокировки основного потока. Как лучше всего использовать несколько запросов NSURLConnection одновременно?

Ответы [ 4 ]

0 голосов
/ 13 января 2016

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

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == aConnection) {

       // Do something with the data for aConnection

    } else if (connection == otherConnection) {

       // Do something with the data for otherConnection

    }
}

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

0 голосов
/ 07 ноября 2010

Возможно, посмотрите ASIHTTPRequest вместо NSURLConnection. ASIHTTPRequest значительно облегчает эту работу.

0 голосов
/ 08 ноября 2010

В этом случае я бы сказал, что NSOperation - ваш лучший выбор. ASIHTTPRequest основан на NSOperation и позволяет обрабатывать каждый запрос как операцию, которая служит делегатом для своего собственного NSURLConnection.

Здесь вам следует быть осторожным, посколькуОперации NSO по умолчанию выполняются в отдельных потоках, но некоторые API, такие как этот, должны выполняться в основном потоке.Если вы проверите исходный код в ASIHTTPRequest, вы заметите, что у них есть некоторая инфраструктура для обеспечения вызова методов делегата в главном потоке.

0 голосов
/ 07 ноября 2010

Я предпочитаю оборачивать их в объект более высокого уровня (например, ImageDownloader или SomeWebServiceCall), который имеет всю информацию о состоянии соединения / вызова.Я обычно создаю делегат этих объектов, чтобы вызывающая сторона получала более конкретный обратный вызов при успешном или неудачном завершении операции.

...