2010-03-18 17 views
5

Estoy usando NSXMLParser para obtener nuevas historias RSS de una fuente y las estoy mostrando en una UITableView. Sin embargo, ahora quiero tomar SOLAMENTE las imágenes y mostrarlas en UIScrollView/UIImageView (3 imágenes una al lado de la otra). Estoy completamente perdido. Estoy usando el siguiente código para obtener 1 imagen de una URL.Desarrollo de iPhone: Obtenga imágenes de la fuente RSS

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]; 

Esto es todo lo que he logrado, y funciona, para una imagen, y tengo que especificar la URL exacta. ¿Qué recomendarías que haga para lograr esto?

Respuesta

0

Parece que primero necesita identificar la etiqueta xml que identifica las imágenes en su documento xml. Debería poder hacer esto escribiendo la llamada de API que está utilizando en una barra de direcciones del navegador.

una vez que haya hecho eso, puede crear una matriz de URL de imágenes del método delegado nsxmlparser que recibe datos nuevos.

una vez que tenga la matriz de la que puede hacer algo similar a la URL de la imagen lo que está haciendo anteriormente, excepto en que se usan NSURL * theUrl1 = [miMatriz objectAtIndex: ...

se puede organizar las imágenes con sólo cambiando su ubicación central: image.center = CGPointMake (160,240) ..

Espero que ayude. hay Apple Docs para nsxmlparser.

+0

Las URL son dinámicas, ya que estoy usando feedburner, esto funcionará con "cualquier" RSS feed? ¡Gracias! –

+0

No estoy seguro de lo que quiere decir con 'las URL son dinámicas'. pero esto debería funcionar para cualquier documento xml, siempre que haya una etiqueta en el documento xml para identificar las URL de la imagen. – Remover

+0

Con esto quiero decir que todas las imágenes están alojadas en diferentes lugares ... –

0

También puede intentar la implementación del diccionario mientras obtiene datos de la llamada API. Primero, debe identificar la etiqueta xml que identifica las imágenes en un documento XML, luego puede asignar cada imagen con su historia correspondiente como clave de imagen en un diccionario. Se asegurará de que, para una historia en particular, solo se muestre su imagen asociada. Luego puede usar esta información más adelante en su solicitud ya que el requisito varía.

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

Quiero sugerirle que use JSON en lugar de xml, ya que es un formato liviano de intercambio de datos . También ahorraría mucho formato y esfuerzo.

+0

Definitivamente estoy dispuesto a darle una oportunidad a JSON, pero no tengo ni idea de cómo hacerlo. lol –

+0

Puede visitar esta página http://code.google.com/p/json-frame Definitivamente va a ayudarlo. Solo tiene que descargar el marco y luego usarlo en su aplicación. Para obtener los datos en tiempo real tiene que hacer lo mismo que en XMLParsing NSString * jsonString = [NSString stringWithContentsOfURL: url codificación: NSUTF8StringEncoding error: nil]; NSDictionary * JDict = [jsonString JSONValue]; o NSArray * JArr = [jsonString JSONValue]; según lo que contenga su carga de datos. –

0

Se puede visitar esta página http://code.google.com/p/json-frame

Es sin duda va a ayudar. Solo tiene que descargar el marco y luego usarlo en su aplicación.
para obtener los datos en vivo que tiene que hacer lo mismo que en XMLParsing

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


    NSDictionary *JDict = [jsonString JSONValue]; 

o

NSArray * JArr = [jsonString JSONValue]; 

dependiendo de lo que contiene sus datos de alimentación.

+0

He agregado el Marco JSON a mi proyecto, sin embargo, no sé qué haría para extraer la imagen de la fuente RSS ... ¿De cualquier forma puede enviarme un correo electrónico para eliminar al intermediario de StackOverflow? mi dirección es [email protected] Gracias –

0

He estado usando NSXMLParser y almacenando los resultados usando CoreData. Utilizo una versión de la clase Parser de Björn Sållarp desde su código CoreData example.

Mis imágenes terminan como NSData/Binary en una base de datos SQLite, pero igual podrían ponerlas en una matriz de UIImage para su visualización inmediata.

Extracto de Parser.m: (de 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; 
    } 

llamado desde mi punto de vista con:

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]; 

Ese código asume su documento XML contiene URL de imágenes con el formato de la etiqueta:

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

Incluso si no está utilizando CoreData, trabajando con el ejemplo en ese enlace sería instructivo para procesar XML con NSXMLParser.

3

Además de mi otra respuesta, que utiliza algunas clases de ayuda y supone que estás almacenando cosas con Core Data, aquí hay una forma pura de NSXMLParser para hacerlo.

En este ejemplo asumo que tiene tres UIImageViews configuradas con etiquetas (100,101,102) para que podamos acceder a ellas. En primer lugar, el código que inicia el programa de análisis:

// 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 

En este punto el análisis se inicia y se NSXMLParser disparar las llamadas a la misma de los métodos de delegado a medida que encuentra diferentes elementos de inicio y fin en el XML.

En este ejemplo yo sólo escribo el método 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];  
    } 
} 

Aquí miramos para ver si el attributeDict (un objeto NSDictionary) contiene un atributo url. Si es así, lo tomamos en currentString y luego lo escapamos, solo en caso de que tenga caracteres en los que NSURL barf on. Luego creamos una imagen a partir de esa URL y establecemos la imagen UIImageView apropiada en función de los números de las etiquetas. imageCount es un contador; una vez que hemos hecho tres imágenes, le decimos a NSXMLParser que aborte el análisis del XML.

Si el código XML pone la URL dentro de etiquetas de elementos como:

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

Tendrá que hacer un poco más trabajo con didEndElement y foundCharacters. Vea el excelente Introduction to Event-Driven XML Programming Guide for Cocoa.

Reuní una aplicación rápida y sucia para probar esto, puedes tomarlo here.