当我调用performFetch时,我的应用程序卡住了

时间:2012-04-14 21:01:32

标签: ios core-data cs193p

我正在使用stanford课程cs193p中的CoreDataTableViewController,并在我的viewWillAppear中调用

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.dataBase.managedObjectContext
                                                                      sectionNameKeyPath:nil
                                                                               cacheName:nil];

在一些随机的场合让我的应用程序冻结(它不会粉碎,它只是冻结)。 在CoreDataTableViewController中,setter进行调用[self performFetch],如下所示:

- (void)performFetch
{
    if (self.fetchedResultsController) {
        if (self.fetchedResultsController.fetchRequest.predicate) {
            if (self.debug) NSLog(@"[%@ %@] fetching %@ with predicate: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName, self.fetchedResultsController.fetchRequest.predicate);
        } else {
            if (self.debug) NSLog(@"[%@ %@] fetching all %@ (i.e., no predicate)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName);
        }
        NSError *error;
        NSLog(@"before");
        [self.fetchedResultsController performFetch:&error];
        NSLog(@"after");
        if (error) NSLog(@"[%@ %@] %@ (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [error localizedDescription], [error localizedFailureReason]);
    } else {
        if (self.debug) NSLog(@"[%@ %@] no NSFetchedResultsController (yet?)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    }
    [self.tableView reloadData];
}

并且它被卡住的线是

[self.fetchedResultsController performFetch:&error];

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

该调用不会挂起您的GU​​I,因为它发生在后台线程中。因此,如果您的GUI挂起,那就是另一个问题。

话虽如此,你不应该在正常操作中称之为。通常,您应该执行以下两项操作之一来保存UIManagedDocument中的更改:

使用撤消管理器,或致电

[doc updateChangeCount: UIDocumentChangeDone];

答案 1 :(得分:0)

在我的情况下,我在viewWillAppear方法上调用PerformFetch,必须在viewDidLoad()方法上调用,即使您使用的是navigationcontroller。 正如我们所知,第二次以后veiwWillappear方法不会被调用,在调用performseguewithidentifer(push)的情况下,不要担心这一点,fetechresultcontroller每次调用后调用。

希望这对某人有所帮助。