2010-09-03 16 views
0

Je suis la programmation d'une application iPhone qui est censée analyser un fichier à plat sur le web, créer des objets gérés à partir du fichier plat et plus tard devrait les afficher dans un UITableView. Il n'y a pas de problèmes avec la sauvegarde et l'affichage, mais je ne peux tout simplement pas obtenir un bon analyseur.L'analyse de mon fichier plat sur iPhone est une douleur dans le ***, s'il vous plaît Aidez-moi

thats le fichier que je veux analyser: Flat-file

Pour autant que je sache, je ne peux pas utiliser le NSXMLParser pour cette tâche (car il est évident qu'il n'y a pas des balises).

Je a d'abord essayé de programmer un NSScanner qui devrait me faire les propriétés intéressantes -> ne fonctionne pas

Maintenant, je suis en utilisant cette méthode:

- (void) parseMemberDataWithURL: (NSString *)urlString 
{ 
    self.memberTempCounter = 1; 

    //Get data from web 
    self.downloadedText = [NSString stringWithContentsOfURL: [NSURL URLWithString: urlString] encoding:NSUTF8StringEncoding error:nil ]; 

    memberArray = [downloadedText componentsSeparatedByString:@";"]; 

    while (self.memberTempCounter<[memberArray count]) 
    { 
     [[ExhibitorController sharedController] createExhibitorWithName:[memberArray objectAtIndex:self.memberTempCounter] 
                    street:[memberArray objectAtIndex:self.memberTempCounter+2] 
                    zip:[memberArray objectAtIndex:self.memberTempCounter+3] 
                    city:[memberArray objectAtIndex:self.memberTempCounter+4] 
                    email:[memberArray objectAtIndex:self.memberTempCounter+7] 
                    phone:[memberArray objectAtIndex:self.memberTempCounter+5] 
                   website:[memberArray objectAtIndex:self.memberTempCounter+8] 
                 produktbereiche:[[memberArray objectAtIndex:self.memberTempCounter+9] componentsSeparatedByString:@","]]; 
     self.memberTempCounter= self.memberTempCounter+13; 
    } 
} 

J'utilise le memberTempCounter pour identifier la propriété.

Les problèmes sont les suivants:

  • Cela ne fonctionne que dans 3 comme 4 fois1 de 4 fois les accidents App et je ne sais pas pourquoi ...
  • La méthode a une performance comme un VW Beetle 1962. L'analyse de tout le bloc de données prend jusqu'à 3 minutes sur mon iPhone 3G

Des idées ou un moyen plus simple de le faire?

Je serais vraiment reconnaissant. Merci d'avance: -)

+0

AH presque oublié: crasehs Device avec: Le fil inconnu s'est écrasé avec la saveur inconnue: 5, état_count: 1 Semble être un problème de mémoire ??? – Amandir

Répondre

1

Vous pouvez aussi bien faire l'analyse en arrière-plan, puis l'afficher au fur et à mesure que l'information est analysée. En ce qui concerne les problèmes de mémoire, essayez de faire des pools d'autorelease temporaires et relâchez toutes les 50 itérations à travers la boucle.

int count = 0; 
NSAutoreleasePool * loopPool = [[NSAutoreleasePool alloc] init]; 
while(someInsanelyLargeCondition){ 

    // Do your stuff here 
    // ............. 

    count++; 
    if (count > 50) { 
     count = 0; 
     [loopPool release]; 
     loopPool = [[NSAutoreleasePool alloc] init]; 
    } 
} 
+0

Thx. Je n'ai pas l'idée d'un Autoreleasepool.Je ne publie rien pendant ma méthode mais écris les données directement dans la base de données. Dernièrement, je pensais à l'analyse des fichiers, les stocker dans un NSArray temporel pour les afficher plus rapidement et gérer l'enregistrement via Thread Background. Des problèmes vous viennent à l'esprit en utilisant cette méthode? Ou qu'en est-il de créer 2 threads supplémentaires pour enregistrer les données analysées dans la base de données? – Amandir

+0

Bien que vous n'autorelease pas, tout au sein de toutes les méthodes que vous appelez pourrait être autorelease. –

0

Les parseurs à descente récurrente (LL1) sont assez simples, légers sur la mémoire, et pour la vitesse ils vont presque aussi vite que vous pouvez exécuter un pointeur à travers les caractères. Construire votre structure de données serait probablement le preneur de temps dominant.

0

J'ai finalement réussi à résoudre mon problème de performance.

J'ai une méthode dans une autre classe, qui affiche des tags pour les différents exposants. Par conséquent, il vérifie d'abord si le Tag est déjà stocké dans la base de données ou bien s'il le crée. Avec un nombre croissant de balises dans ma base de données, le processus de recherche prenait de plus en plus de temps, ce qui entraînait un long temps d'analyse.

Toute autre personne ayant ce problème: Jetez un coup d'oeil au guide de programmation de la performance de base de données de la pomme dans la « mise en œuvre Trouvez-ou Créer Efficacement » -section:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html