2

我正在使用斯坦福课程 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];

有什么建议么?

4

2 回答 2

1

就我而言,我在 viewWillAppear 方法上调用 PerformFetch,它必须在 viewDidLoad() 方法上调用,即使您使用的是导航控制器。正如我们所知,第二次以后 veiwWillappear 方法不会被调用,在调用 performeguewithidentifer(push) 的情况下,不用担心,每次在 move-back-next 时都会调用 fetechresultcontroller。

希望这可以帮助某人。

于 2017-03-03T14:17:34.397 回答
0

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

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

使用撤消管理器,或调用

[doc updateChangeCount: UIDocumentChangeDone];
于 2012-04-14T21:20:14.393 回答