iPhone Development: Получите изображения от канала RSS

Я использую 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
задан Matthew Saeger 18 March 2010 в 21:02
поделиться

5 ответов

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

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

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

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

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

0
ответ дан 15 December 2019 в 06:22
поделиться

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

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

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

0
ответ дан 15 December 2019 в 06:22
поделиться

Вы можете посетить эту страницу 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
ответ дан 15 December 2019 в 06:22
поделиться

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

В этом примере я предполагаю, что у вас есть три настройки UIImageView с тегами (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 .См. Прекрасное Introduction to Event-Driven XML Programming Guide for Cocoa .

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

3
ответ дан 15 December 2019 в 06:22
поделиться

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

Мои изображения заканчиваются как 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
ответ дан 15 December 2019 в 06:22
поделиться