Поиск NSRange в UITextView с медленным NSMutableAttributedString

Я пытаюсь выполнить поиск по содержимому моего атрибута UITextView со следующим кодом:

NSRange range = NSMakeRange(0, haystack.length);

range = [haystack rangeOfString:searchText options:NSCaseInsensitiveSearch range:range];

while (range.location != NSNotFound)
{
    [_attrString addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(range.location, range.length)];

    range = NSMakeRange(range.location+range.length, haystack.length-(range.location+range.length));
    range = [haystack rangeOfString:searchText options:NSCaseInsensitiveSearch range:range locale:nil];
}

...

_textView.attributedText = _attrString;

_attrString это конечно же NSMutableAttributedString

Это отлично работает, за исключением того, что это очень медленно с большими текстами. Для UITextView, содержащего 156 000 символов, требуется несколько секунд, чтобы изменения стали видны. Если я NSLog отдельные шаги цикла, я вижу, что код выполняется быстро. Изменения становятся видимыми в UITextView через пару секунд.

Требуется ли какое-то время для перерисовки атрибута UITextview? Делаете ли вы что-нибудь, чтобы ускорить процесс? Я попытался выполнить поиск по тексту с помощью регулярных выражений, но это, похоже, ничего не изменило.

Спасибо


person Joseph    schedule 18.06.2013    source источник


Ответы (1)


Используйте NSPпредикат

UITextField *txtFld=(UITextField *)sender;
    //    if (![txtFld.text isEqualToString:@""]) {
    //[self getSearchResult:txtFld.text];
    //    }else{
    //        [self makeViewSmall];
    //    }

    // For string kind of values:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", txtFld.text];
    NSArray *results = [[sortedDic valueForKey:@"locations"] filteredArrayUsingPredicate:predicate];
    NSLog(@"Result=%@",results);*/
person Vizllx    schedule 15.10.2013