Use NSXMLParser para analizar las primeras diez publicaciones, luego analice el siguiente lote por separado

Estoy usando NSXmlParser para analizar un feed de RSS. Todo está funcionando bien hasta ahora.

Estoy anticipando que el feed de RSS eventualmente contendrá docenas / cientos de publicaciones. Mi solución actual es leer todo el feed de RSS y mostrar los resultados. Sin embargo, solo quiero leer las primeras diez publicaciones (para evitar que analice potencialmente cientos de artículos). Luego, en un momento posterior (digamos cuando el usuario llega al final de la tabla) para analizar las siguientes diez publicaciones.

Entonces, mi pregunta es cómo analizar las primeras diez publicaciones, luego analizar las siguientes diez publicaciones, luego las próximas diez publicaciones, etc.

Esto es lo que estoy usando para get TODAS las publicaciones:

- (void)parseXMLFileAtURL:(NSString *)URL { myArray = [[NSMutableArray alloc] init]; //convert the path to a proper NSURL or it won't work NSURL *xmlURL = [NSURL URLWithString:URL]; rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; [rssParser setDelegate:self]; [rssParser parse]; } - (void)parser:(NSXMLParser *)parser parseErrorOccurnetworking:(NSError *)parseError { //error } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ currentElement = [elementName copy]; if ([elementName isEqualToString:@"item"]) { //clear out our story item caches... item = [[NSMutableDictionary alloc] init]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"item"]) { // save values to an item, then store that item into the array... } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ // save the characters for the current item... } - (void)parserDidEndDocument:(NSXMLParser *)parser { [myTable reloadData]; } 

En una respuesta de estilo diferente de los demás, quiero contribuir que si su analizador está tardando tanto en analizar donde la diferencia entre 10 y 100 es una cantidad significativa medible por humanos, entonces está haciendo algo mal. Probablemente sea mejor para:

  1. Indique su código de análisis para encontrar la ralentización (o busque una biblioteca XML de mayor performance)
  2. Analiza todo el lote en un hilo de background
  3. Solo muestra los primeros 10 al usuario,
  4. Muestra el rest de la memory a medida que avanza.

Es una doble victoria porque analizarlo todo a la vez hace que el código sea más simple y less errores, y "cargar" (mostrar) una "página" rss de una en una será increíble y tus usuarios te amarán (mira Instagram para ver ejemplos en la velocidad de falsificación)

Puede llamar a [rssParser abortParsing] para detener el análisis. Después de que lo detuvo, debe cortar manualmente la primera parte del xml. O decirle al service web de alguna manera. El NSXMLParser no le dará acceso para saltar allí.

Definitivamente haz una count var en tu encabezado de class:

 ... @private NSUInteger rssCounter; ... @property (nonatomic, assign) NSUInteger rssCounter; ... 

En el método init de sus delegates:

 rssCounter = 0; 

Luego, simplemente incremente esta variable cada vez que llegue al final de un elemento, entonces, como lo indica @Metalmi, utilice el análisis de interrupción en un bloque si más al iniciar un elemento.

Después de eso, cree un método que restablezca la variable a 0 cuando necesite cargar 10 más, a la que puede llamar cuando necesite activar todo el process nuevamente.

Algo como:

 - (void)restartParsing:(NSString *)url { rssCounter = 0 [self parseXMLFileAtURL:url]; } 

Espero que esto ayude.

Estoy de acuerdo con @coneybeare, parece ser la forma correcta de analizar xml en hilo de background y almacenar el resultado en memory.

Sin embargo, si aún desea analizar xml "página por página", puede hacerlo utilizando xmlParseChunk desde libxml (consulte Ejemplo de XMLPerformance, por ejemplo). Deberá calcular manualmente los artículos y almacenarlos en alguna parte, pero supongo que es la funcionalidad más cercana que puede sacar de la caja.

Otra forma es tomar cualquier analizador xml de código abierto gratuito de Objective-C (puede ser incluso DOM-parser, como ejemplo TBXML ) y separar su bucle de análisis interno de la forma que más le convenga.