Более быстрый способ получения изображений из XML-канала - PullRequest
1 голос
/ 30 марта 2012

Я загружаю данные в UITableView через XML-канал с сайта Wordpress.Я хотел отобразить таблицу с изображением, если публикация содержала его, и изображение по умолчанию, если его нет.Итак, в моем методе

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

у меня есть оператор if, который выглядит следующим образом:

if ([elementname isEqualToString:@"content:encoded"]) {
    NSString *firstImageURL = [self getFirstImageUrl:currentStory.content];
    currentStory.imageURL = firstImageURL;
    UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString: firstImageURL]]];
    currentStory.image = image;
}

Это вызывает getFirstImageURL, который выглядит следующим образом:

-(NSString *)getFirstImageUrl: (NSString *) html {
    NSScanner *theScanner;
    NSString *imageURL = nil;

    theScanner = [NSScanner scannerWithString: html];

    // find start of tag
    [theScanner scanUpToString: @"<img" intoString: NULL];
    if ([theScanner isAtEnd] == NO) {

        [theScanner scanUpToString: @"src=\"" intoString: NULL];
        NSInteger newLoc2 = [theScanner scanLocation] + 5;
        [theScanner setScanLocation: newLoc2];

        // find end of tag
        [theScanner scanUpToString: @"\"" intoString: &imageURL];
    }

    return imageURL;
}

Все работает как надо, но загрузка таблицы занимает от 5 до 6 секунд и иногда может занимать до 10 секунд, что нежелательно.Мне было интересно, могу ли я что-нибудь сделать, чтобы ускорить процесс захвата первой фотографии.

ОБНОВЛЕНИЕ

Итак, после дополнительных исследований выясняется, что узкое местоЯ вижу, что не имеет никакого отношения к загрузке изображений.На самом деле загрузка изображений занимает не более 2 секунд.Похоже, что узкое место возникает, когда я загружаю RSS-канал:

NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 

Это занимает больше всего времени.

2012-03-30 14:35:11.506 gbllc[883:3203] inside grabDataForFeed
2012-03-30 14:35:11.510 gbllc[883:3203] reached loadXMLByURL
2012-03-30 14:35:11.512 gbllc[883:3203] after stories alloc

**** 5 seconds ****

2012-03-30 14:35:16.568 gbllc[883:3203] after initWithContentsOfURL
2012-03-30 14:35:16.570 gbllc[883:3203] after initWithData
2012-03-30 14:35:16.573 gbllc[883:3203] about to parse

*** I now parse the XML and download images, takes 2 seconds ***

2012-03-30 14:35:18.066 gbllc[883:3203] Parsed successfully

Сразу после размещения объекта данных я получаю данные для анализа.Поэтому я думаю, что мой исходный вопрос больше не действителен, и мне, вероятно, следует спросить, есть ли более быстрый способ получения исходных данных для анализа или мне следует изменить свою модель и попытаться использовать json или что-то еще?

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Я отметил ответ Джоэла как лучший ответ, потому что он дал мне идею асинхронной загрузки изображений, но решение, которое я в итоге использовал, здесь:

http://howtomakeiphoneapps.com/how-to-asynchronously-add-web-content-to-uitableview-in-ios/1732/

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

1 голос
/ 30 марта 2012

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

Вот прекрасный пример того, как это сделать:

...