NSFetchedResultsController вызывает зависание iPhone 3G - PullRequest
1 голос
/ 30 марта 2011

У меня есть UISearchDisplayController, который изменяет NSP-предикат NSFetchRequest при каждом изменении searchBar. Этот запрос на выборку связан с NSFetchedResultsController, который обновляет searchResultsTableView.

Они работают без сбоев на устройствах iOS> = iPhone 3GS, но с треском проваливаются на устройствах iPhone 3G, полностью замораживая пользовательский интерфейс, как только содержимое панели поиска даже слегка изменяется. Это даже происходит, если в постоянном хранилище вообще нет записей.

Извлечение фактически выполняется, потому что приложение не закрывается из-за выхода (-1).

Кто-нибудь видел такую ​​проблему или есть идеи, как ее решить?

(Делается это на iOS 4.3SDK с целевым значением развертывания 4.0. IPhone 3G, который зависает под OS 4.2.1.)


Код для создания поиска FRC:

-(NSFetchedResultsController *)searchFetchedResultsController {

if (__searchResults) {
    return __searchResults;
}

NSFetchRequest *fetchrequest = [[NSFetchRequest alloc] init];
[fetchrequest setEntity:[NSEntityDescription entityForName:@"Product" inManagedObjectContext:[[LBCCacheManager sharedLBCCacheManager] managedObjectContext]]];

[fetchrequest setFetchBatchSize:20];
[fetchrequest setPropertiesToFetch:[NSArray arrayWithObjects:@"title", @"slug", nil]];

NSSortDescriptor *recentSort = [NSSortDescriptor sortDescriptorWithKey:@"dealsCount" ascending:NO];
[fetchrequest setSortDescriptors:[NSArray arrayWithObject:recentSort]];

NSFetchedResultsController *fetchedcontroller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchrequest
                                                                                    managedObjectContext:[[LBCCacheManager sharedLBCCacheManager] managedObjectContext]
                                                                                      sectionNameKeyPath:nil 
                                                                                               cacheName:nil];

fetchedcontroller.delegate = self;

[__searchResults release], __searchResults = nil;
__searchResults = [fetchedcontroller retain];

[fetchedcontroller release];
[fetchrequest release];

return  __searchResults;
}

Код для каждого изменения панели поиска:

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if ([controller.searchBar.text length] > 0) {
    [self contentFilter:controller];
}
return YES;
}

-(void)contentFilter:(UISearchDisplayController *)controller {
    [[self searchFetchedResultsController].fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"title contains[c] %@", controller.searchBar.text]];

    NSError *error = nil;
    if (![[self searchFetchedResultsController] performFetch:&error]) {
        NSLog(@"ERROR");
        exit(-1);
    }
}

1 Ответ

0 голосов
/ 31 марта 2011

Кажется, что денормализация модели разрешила эту проблему.

Никогда больше не будет делать ManagedObjects с родительской сущностью для устройств более старого поколения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...