Создать новый класс делегата для каждой загрузки асинхронного изображения? - PullRequest
1 голос
/ 26 марта 2010

Во-первых, я использую NSURLConnection для загрузки данных JSON из твиттера. Затем я использую второй NSURLConnection для загрузки соответствующих изображений аватара пользователя (URL-адреса изображений анализируются после первой загрузки данных).

Для первого подключения к данным мой TwitterViewController установлен как делегат NSURLConnection. Я создал отдельный класс (ImageDownloadDelegate) для функции в качестве делегата для второго NSURLConnection, который обрабатывает изображения. После завершения загрузки твитов я использую этот код для получения аватаров:

for(int j=0; j<[self.tweets count]; j++){
    ImageDownloadDelegate *imgDelegate = [[ImageDownloadDelegate alloc] init];

    Tweet *myTweet = [self.tweets objectAtIndex:j];
    imgDelegate.tweet = myTweet;
    imgDelegate.table = timeline; //to reload the data

    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:myTweet.imageURL]
                                                                  cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                              timeoutInterval:60];
    imgConnection = [[NSURLConnection alloc] initWithRequest:request delegate:imgDelegate];
    [imgDelegate release];  
}

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

Алгоритм работает отлично ... Мне просто интересно, пойду ли я по нему наиболее эффективным способом.

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

Поместите загрузки изображений в нечто вроде NSOperationQueue.

Когда загрузка изображения будет завершена, сохраните его в каталоге caches, затем отправьте уведомление, содержащее исходный URL изображения и имя файла, в котором теперь находится изображение.

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

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

0 голосов
/ 26 марта 2010

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

Запросы основаны на классе NSOperation, а очередь - на NSOperationQueue, так что эта инфраструктура выполняет большую часть работы по кодированию.

...