Создание несамостоятельного делегата в obj-c - PullRequest
1 голос
/ 22 апреля 2011

Чтобы использовать асинхронные http-запросы в задаче c, вам нужно установить делегата на NSURLConnection.Проблема в том, что мне нужно сделать несколько HTTP-запросов, поэтому один и тот же делегат (сам) не будет работать.

Как лучше всего это сделать?Должен ли я создать новый класс делегата для каждого http-запроса?Являются ли эти делегаты просто NSObjects?

Ответы [ 4 ]

5 голосов
/ 22 апреля 2011

У вас есть несколько вариантов. Двумя наиболее распространенными являются:

  • Создайте новый класс для каждого соединения (да, подкласс NSObject) и установите их в качестве делегатов - пусть они выполняют любую логику, необходимую вам при загрузке данных

  • Установите один класс в качестве делегата и сохраните ссылки на все ваши NSURLConnection s. Таким образом, когда ваш делегат получает вызов - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data, вы можете проверить, какой NSURLConnection используется (например, if ([connection == myConnection]) - или какой метод делегата вы используете)

1 голос
/ 22 апреля 2011

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

- (void) downloadFileFrom:(NSString*) httpLocation respondAt:(SEL)selector on:(id)target withParam:(id)param
{
    self.finishSelector = selector;
    self.delegate = target;
    self.responseParams = param;
}

Класс является собственным делегатом NSURLConnection.Поэтому экземпляр отделен от других, которые я могу создать, и он обрабатывает создание своего собственного результата, с которым я могу работать.Я держусь за объект param.это может быть что угодно.

В конце загрузки он выполняет executeSelector: для делегата.передавая себя делегату.

if ([self.target respondsToSelector:self.selector])
{
    [self.target performSelector:self.selector withObject:self.param];
}

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

MyDownloader downloader = [[MyDownloader alloc] init];
[downloader downloadFileFrom:@"http://www.mydomain.com/myimage" respondAt:@selector(myFileIsComplete:) on:self withParam: downloader];
[downloader autorelease];

другой вариантсоздать @protocol для класса, на который вы отвечаете, и попросить делегата соответствовать респонденту.

1 голос
/ 22 апреля 2011

Это кажется подходящим.

Как мне создать делегатов в Objective-C?

0 голосов
/ 22 апреля 2011

Это должно работать, но есть еще один вариант для рассмотрения.Вы можете создать универсальный класс, который создает и вызывает NSURLConnection при условии, что они достаточно распространены.Затем сохраните NSArray или NSDictionary классов.По одному на каждое соединение.

Пример: у меня есть приложение, которое должно загружать несколько фотографий одновременно.Поэтому у меня класс GetFlickrPhoto.У него есть собственный метод init, который получает URL и любую другую необходимую информацию.Каждый отдельный класс создает NSURLConnection и может безопасно установить делегата на self

. Это помогает хранить вещи и быть очень управляемыми / повторно используемыми.

Чтобы продвинуться дальше:

Приложение, которое я упоминал ранее, также необходимо для загрузки каналов JSON.Поэтому я создал класс GenericDownload, который взял URL и асинхронно загрузил NSData, а затем возвратил NSData вызывающему делегату через определенные протоколы успеха / сбоя.Мне было все равно, что содержится в NSData.

Я изменил GetFlickrPhoto, чтобы позвонить GenericDownload и использовать возвращенный NSData для фотографии.Затем я создал класс GetJSON, который также называется GenericDownload, и проанализировал возвращенное значение NSData в фиде JSON.

Требуется немного больше времени, но в итоге вы будете рады обслуживанию и будущим проектам.

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