J'ai un problème étrange, quand il s'agit d'analyser XML avec NSXMLParser sur l'iPhone. Au démarrage de l'application, je souhaite précharger 4 vues de table, qui sont alimentées par RSS-Feeds en arrière-plan.iPhone: analyser plusieurs XML avec NSXMLParser en arrière-plan se déranger
Lorsque j'initie les vues de table une par une, que le chargement, l'analyse et l'affichage de tous les travaux comme un charme. Mais quand j'essaie d'init tout à la fois (en même temps), il semble que les instances XML-parser se dérangent. D'une manière ou d'une autre, les données d'un XML-Feed sont "diffusées" dans d'autres instances de xml-parser, où elles n'appartiennent pas. Exemple: il y a un item "membre d'équipe", avec "Ceci est mon nom". Lorsque ce bogue se produit, il y a une chaîne d'un autre flux xml ajouté, c'est-à-dire: "Ceci est mon nom58", où 58 est la position de la carte de quelque chose de l'autre vue. "58" semble manquer alors dans l'autre cas.
Il me semble que ce bogue se produit en raison de la méthode NSXMLParser-délégué:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
currentStringValue = [[NSMutableString alloc] initWithCapacity:50];
}
[currentStringValue appendString:string];
}
Dans ce cas, « par hasard » octets sont ajoutés à des chaînes, où ils ne font pas partie. La chose étrange est, que chaque instance de NSXMLParser est unique, a ses propres délégués uniques, qui sont attachés à leur propre ViewController. Chaque requête d'analyse génère sa propre tâche d'arrière-plan, avec sa propre Autorelease-pool (également nommée).
J'appelle le NSXMLParser comme celui-ci dans le ViewController:
// prepare XML saving and parsing
currentStringValue = [[[NSMutableString alloc] initWithCapacity:50] retain];
charts = [[NSMutableArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://(SOME XML URL)"];
xmlParser = [[[NSXMLParser alloc] initWithContentsOfURL:url] retain];
//Set delegate
[xmlParser setDelegate:self];
//loading indicator
progressWheel = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(150.0,170.0,20.0,20.0)] autorelease];
progressWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
[self.view addSubview:progressWheel];
[progressWheel startAnimating];
// start loading and parsing the xml-feed in the background
//[self performSelectorInBackground:@selector(parse:) withObject:xmlParser]; -> I also tried this
[NSThread detachNewThreadSelector:@selector(parse:) toTarget:self withObject:xmlParser];
Et c'est l'un des arrière-plan-tâches, l'analyse de l'alimentation:
- (void) analyser: (NSXMLParser *) myParser {
NSAutoreleasePool *schedulePool = [[NSAutoreleasePool alloc] init];
BOOL success = [myParser parse];
if(success) {
NSLog(@"No Errors. xmlParser got: %@", myParser);
(POST-PROCESSING DETAILS OF THE DATA RETURNED)
[self.tableView reloadData];
} else {
NSLog(@"Couldn't initalize XMLparser");
}
[progressWheel stopAnimating];
[schedulePool drain];
[myParser release];
}
ce qui pourrait provoquer ce problème? Est-ce que j'appelle la tâche de fond dans le bon sens? Pourquoi ce bug approche-t-il, puisque chaque XML-Parser a sa propre instance unique?
La ligne 'currentStringValue = [[[NSMutableString alloc] initWithCapacity: 50] conserve];' est incorrecte. Quand vous allouez, vous le retenez. Ensuite, vous le retenez encore. Voulez-vous utiliser autorelease au lieu de conserver? – lucius