2013-03-26 3 views
0

Я использую объект NSLinguisticTagger и его метод enumerateTagsInRange: схема: options: usingBlock.Невозможно остановить блок NSLinguisticTagger

Проблемы возникают, когда я использую длинную строку, без разрывов строк, я не могу остановить блок.

Вот мой код, чтобы начать строку и NSLinguisticTagger:

NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[NSLinguisticTagSchemeTokenType] 
                    options:NSLinguisticTaggerOmitOther | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace]; 

[tagger setString:@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."]; 

[tagger enumerateTagsInRange:NSMakeRange(0, [tagger.string length]) 
         scheme:NSLinguisticTagSchemeTokenType 
        options:NSLinguisticTaggerOmitOther | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace 
        usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop){ 

         NSString *word = [tagger.string substringWithRange:tokenRange]; 

         if ([word compare:@"lamet" options:NSCaseInsensitiveSearch] == NSOrderedSame) { 
          *stop = YES; 
         } 
        } 
]; 

Что я ожидал это, после того, как я установил * стоп = YES блок остановить его петлю. Но этого не происходит. Блок переходит к другому предложению, но не останавливается. Если строка имеет разрывы строк (\ n) в конце предложений, блок останавливается, как я ожидал (с тем же кодом). Но когда строка имеет разрывы строк, блок вызывает утечку памяти.

Кто-нибудь знает, что происходит, и что я могу попытаться заблокировать работу, как я ожидал?

Метод струнной enumerateSubstringsInRange: Опции: usingBlock: не решить мою проблему в моем действительном решении ... Я хотел бы использовать NSLinguisticTagger ...


Я сделал контакт с Apple, Developer Техническая поддержка с этой проблемой, и они заставили меня зарегистрировать это как ошибку. Поэтому я сделал отчет об ошибке, и я жду ответа. Любые новости Я отредактирую этот пост.

ответ

0

Я выполнил те же шаги в iOS 7.1, и проблема больше не возникает.

Когда я сообщил об этом Apple в качестве ошибки, они ответили, что, возможно, были решены в iOS7. Но только сейчас у меня есть время, чтобы проверить это снова.

0

Странно!

Я смог повторить вашу проблему. Если вы установите stop на YES, это выглядит как enumerateTagsInRange по-прежнему перечисляет первое слово любых остальных предложений!

Один из способов обойти эту проблему было бы изменить вызов enumerateTagsInRange на:

[tagger enumerateTagsInRange:NSMakeRange(0, [tagger.string length]) scheme:NSLinguisticTagSchemeTokenType options:NSLinguisticTaggerOmitOther | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop){

if (*stop == NO) { // Only deal with the word if stop if not set to YES 
     NSString *word = [tagger.string substringWithRange:tokenRange]; 

     if ([word compare:@"lamet" options:NSCaseInsensitiveSearch] == NSOrderedSame) { 
      *stop = YES; 
     } 
    } 
}]; 

См добавил, если заявление.

+0

Мне тоже показалось странным ... Это решение разрешает этот случай. Но в моем коде я вызываю эту функцию много раз для одной и той же строки (только с разным диапазоном). Таким образом, если я не останавливаю блок, он идет до конца строки каждый раз, когда я вызываю функцию, и это замедляет приложение. – Yudmt

Смежные вопросы