Разработка iPhone: получение изображений из RSS-канала - PullRequest
5 голосов
/ 19 марта 2010

Я использую NSXMLParser для получения новых RSS-новостей из ленты и отображаю их в UITableView. Однако теперь я хочу взять ТОЛЬКО изображения и отобразить их в UIScrollView / UIImageView (3 изображения рядом). Я полностью потерян. Я использую следующий код для получения 1 изображения из URL.

   NSURL *theUrl1=[NSURL URLWithString:@"http://farm3.static.flickr.com/2586/4072164719_0fa5695f59.jpg"];
 JImage *photoImage1=[[JImage alloc] init];
 [photoImage1 setContentMode:UIViewContentModeScaleAspectFill];
 [photoImage1 setFrame:CGRectMake(0, 0, 320, 170)];
 [photoImage1 initWithImageAtURL:theUrl1];
 [imageView1 addSubview:photoImage1];
 [photoImage1 release];

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

Ответы [ 5 ]

3 голосов
/ 18 мая 2010

В дополнение к моему другому ответу, который использует некоторые вспомогательные классы и вроде бы предполагает, что вы храните вещи с Core Data, вот чистый NSXMLParser способ сделать это.

В этом примере я предполагаю, что у вас есть три UIImageViews с тегами (100,101,102), чтобы мы могли получить к ним доступ. Во-первых, код, который запускает парсер:

    // Set the URL with the images, and escape it for creating NSURL
    NSString *rssURLString = @"http://feeds.gettyimages.com/channels/RecentEditorialEntertainment.rss";
    NSString *escapedURL = [rssURLString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
    NSURL *rssURL = [NSURL URLWithString:escapedURL];

    // rssParser is an NSXMLParser instance variable
    if (rssParser)  [rssParser release];    
    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:rssURL]; 
    [rssParser setDelegate:self];   
    success = [rssParser parse];    // return value not used

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

В этом примере я пишу только метод didStartElement:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{   
    // look for an attribute called url
    if ([attributeDict objectForKey:@"url"]) {

        currentString = [attributeDict objectForKey:@"url"];        
        NSLog(@"Image URL: %@", currentString);

        NSString* escapedURL = [currentString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
        UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:escapedURL]]];        

        UIImageView * tmpImageView = (UIImageView*)[scrollView viewWithTag:100+imageCount];
        [tmpImageView setImage:image];

        NSLog(@"images found: %d", imageCount);
        imageCount++;       
        if (imageCount>2) [rssParser abortParsing];     
    }
}

Здесь мы посмотрим, содержит ли attributeDict (объект NSDictionary) атрибут url. Если это так, мы берем его в currentString, а затем экранируем его, просто добавляем в него символы, которые NSURL будет использовать. Затем мы создаем изображение из этого URL и устанавливаем соответствующее изображение UIImageView на основе номеров тегов. imageCount - счетчик; как только мы сделали три изображения, мы сообщаем NSXMLParser прервать синтаксический анализ XML.

Если ваш XML помещает URL-адрес в теги элемента, например:

<image>http://example.com/image.jpg</image>

Вам нужно будет немного больше поработать с didEndElement и foundCharacters. См. Превосходное Введение в управляемое событиями XML-руководство по программированию для какао .

Я собрал быстрое и грязное приложение для демонстрации этого, вы можете взять его здесь .

0 голосов
/ 12 мая 2010

Я сам использовал NSXMLParser и сохранял результаты с помощью CoreData. Я использую версию класса Parser Бьёрна Солларпа из его примера CoreData кода.

Мои изображения заканчиваются как NSData / Binary в базе данных SQLite, но они также могут быть помещены в массив UIImage для немедленного отображения.

Выписка из Parser.m: (из Björn Sållarp)

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

    if ([elementName isEqualToString:@"imagetag"]) 
    {
        UIImage *newImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:currentString]]];

        NSData *imageData = UIImagePNGRepresentation(newImage);

        [currentSearchResult setImage:imageData];

        currentString = nil;
        return;
    }

На мой взгляд, с:

NSString *searchURL = @"http://www.feedurl.com/feed/address/feed.xml";
NSURL *xmlURL = [NSURL URLWithString:searchURL];

Parser *xmlParse = [[Parser alloc] initWithContext:managedObjectContext];
[xmlParse parseXMLFileAtURL:xmlURL parseError:&parseError];

Этот код предполагает, что ваш XML-документ содержит URL-адреса изображений с форматом тега:

<imagetag>http://example.com/path/to/image.png</imagetag>

Даже если вы не используете CoreData, работа с примером по этой ссылке будет полезна для обработки XML с помощью NSXMLParser.

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

Вы также можете попробовать реализацию словаря при получении данных из вызова API. Сначала вы должны идентифицировать тег XML, который идентифицирует изображения в документе XML, затем вы можете назначить каждое изображение с соответствующей историей в качестве ключа изображения в словарь. Это гарантирует, что для конкретной истории будет отображаться только соответствующее изображение. Затем вы можете использовать эту информацию позже в вашем приложении, так как требования различаются.

NSMutableDictionary * mutDict = [[NSMutableDictionary allloc] init]; if ([elementName isEqualToString: @ "story_image"]) { [mutDict setObject: currentImage forKey: currentStory]; }

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

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

Вы можете посетить эту страницу http://code.google.com/p/json-frame

Это определенно вам поможет. Вы должны просто загрузить фреймворк и использовать его в своем приложении.
Чтобы получить действительные данные, вы должны сделать то же самое, что и в XMLParsing

    NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];


    NSDictionary *JDict = [jsonString JSONValue];

или

    NSArray * JArr = [jsonString JSONValue];

в зависимости от того, что содержит ваш фид данных.

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

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

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

когда у вас есть массив URL-адресов изображений, вы можете сделать что-то похожее на то, что вы делаете выше, за исключением того, что вы используете NSURL * theUrl1 = [myArray objectAtIndex: ...

Вы можете упорядочить изображения, просто изменив их расположение в центре: image.center = CGPointMake (160,240) ..

надеюсь, это поможет. для nsxmlparser есть яблочные документы.

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