2013-02-07 13 views
5

Próbuję parsować słownik medyczny (plik .csv), a następnie nauczyć się wszystkich tych słów metodą UITextChecker: learnword, aby sprawdzanie pisowni zatwierdzało te terminy medyczne jako prawidłowe słowa.UITextChecker: Problem z pamięcią z tysiącami słów

Wywołanie tej metody w innym wątku, ale ilość słów w pliku csv jest około 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]; 

} 

Mam stosowane Instruments czas Profiler i okazało się, że problem leży w wierszu, w którym uczę słowo wewnątrz pętli.

Aplikacja próbuje załadować słownik do 5000 słów (w przybliżeniu), a następnie ulega awarii.

Każda pomoc zostanie doceniona.

Dzięki

+4

Jesteś zdecydowanie podkreślić testowania UITextChecker w sposób grupa QA Apple prawdopodobnie nie spodziewał. Jesteś 1) używasz go w wątku w tle zamiast wątku głównego (UI) i 2) próbujesz dodać tysiące słów naraz. Jeśli nie otrzymasz przyzwoitej odpowiedzi od kogoś innego, polecam zapakowanie tak dużej ilości kodu, jaki możesz ujawnić (co pokazuje problem) i zgłoszenie błędu na stronie [http://bugreporter.apple.com] (http : //bugreporter.apple.com) wysyłając im ten kod, aby sam mógł go wypróbować. –

+0

Użyj @autoreleasepool –

+1

Tworzysz 2 NSStrings i NSCharacterSet dla każdej iteracji. Zapoznaj się z aplikacją, aby sprawdzić, czy jest ona znacząca. – jcm

Odpowiedz

1

Nie musi wywołać metody klasy UIKit na wątek w tle - to będzie wynik w wypadkach. Ponadto musisz utworzyć w swojej metodzie pulę autorelease, aby nie przeciekać żadnych obiektów. Ponieważ UITextChecker musi być używany w głównym wątku, zalecam dodawanie tylko kilku słów naraz, a następnie powracanie do pętli uruchamiania, aby nie utknąć w aplikacji. Wyświetlaj w trakcie procesu spinner, aby wiedział, co robi.

0

wystarczy zmienić wartość i = 0. To ci pomoże. Na przykład:

for (i=0; i<[csvContent count]; i++) 
Powiązane problemy