2013-02-07 4 views
5

Ich versuche, ein medizinisches Wörterbuch (.csv-Datei) zu parsen und dann alle diese Wörter durch die UITextChecker: learnword Methode zu lernen, so dass die Rechtschreibprüfung diese medizinischen Begriffe als gültige Wörter genehmigt.UITextChecker: Speicherproblem mit dem Lernen von Tausenden von Wörtern

Ich rufe diese Methode in einem anderen Thread, aber die Anzahl der Wörter in der CSV-Datei ist um 50K.

- (void)parseMyCSVFile{ 

for (int i = 1; i < [csvContent count]; i++) { 
    NSString *learntWord = [NSString stringWithFormat:@"%@",[csvContent objectAtIndex:i]]; 

    NSString *s = learntWord; 
    NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"()\n\""]; 
    s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 


    if ([UITextChecker hasLearnedWord:s]){ 

     NSLog(@"skipped"); 

    } 
    else 
    { 
     [UITextChecker learnWord:s]; // Memory Issue Here 
     NSLog(@"learning"); 
    } 

    HUD.detailsLabelText = [NSString stringWithFormat:@"%i of %i",i,[csvContent count]]; 
} 

[self performSelectorOnMainThread:@selector(bgWorkEnded) withObject:nil waitUntilDone:YES]; 

} 

Ich habe Instrumente Zeit Profiler angewandt und fand heraus, dass das Problem in der Linie liegt, wo ich Wort innerhalb der Schleife am Lernen.

Die App versucht, das Wörterbuch bis zu 5000 Wörter (ca.) zu laden und stürzt dann ab.

Jede Hilfe wäre willkommen.

Dank

+4

Sie sind auf jeden Fall betonen UITextChecker Prüfung in einer Weise QA Gruppe von Apple wahrscheinlich nie erwartet. Sie verwenden 1) es in einem Hintergrund-Thread anstelle des Haupt-Threads (UI) und 2) versuchen Sie, Tausende von Wörtern gleichzeitig hinzuzufügen. Wenn Sie keine angemessene Antwort von jemand anderem erhalten, würde ich empfehlen, so viel Code wie möglich zu veröffentlichen (was das Problem demonstriert) und einen Fehler bei [http://bugreporter.apple.com] (http: // bugreporter.apple.com) zu melden : //bugreporter.apple.com) senden sie diesen Code, um es selbst auszuprobieren. –

+0

Verwenden Sie einen @autoreleasepool –

+1

Sie erstellen 2 NSStrings und ein NSCharacterSet für jede Iteration. Profiliere deine App, um zu sehen, ob das wichtig ist. – jcm

Antwort

1

Sie müssen nicht UIKit Klassenmethoden auf einem Hintergrund-Thread nennen - dieses wird Ergebnis in Abstürzen. Außerdem müssen Sie unter einen Autorelease-Pool innerhalb Ihrer Methode erstellen, damit Sie keine Objekte auslaufen lassen. Da UITextChecker im Hauptthread verwendet werden muss, würde ich empfehlen, nur einige Wörter gleichzeitig hinzuzufügen und dann zur Ausführungsschleife zurückzukehren, damit die App nicht blockiert wird. Zeigen Sie dem Benutzer während dieses Vorgangs einen Drehfeld an, damit er weiß, was er tut.

0

ändern Sie einfach den Wert von i = 0. Dies wird Ihnen helfen. Zum Beispiel:

for (i=0; i<[csvContent count]; i++) 
Verwandte Themen