我正在使用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];
有什么建议吗?
答案 0 :(得分:0)
该调用不会挂起您的GUI,因为它发生在后台线程中。因此,如果您的GUI挂起,那就是另一个问题。
话虽如此,你不应该在正常操作中称之为。通常,您应该执行以下两项操作之一来保存UIManagedDocument中的更改:
使用撤消管理器,或致电
[doc updateChangeCount: UIDocumentChangeDone];
答案 1 :(得分:0)
在我的情况下,我在viewWillAppear方法上调用PerformFetch,必须在viewDidLoad()方法上调用,即使您使用的是navigationcontroller。 正如我们所知,第二次以后veiwWillappear方法不会被调用,在调用performseguewithidentifer(push)的情况下,不要担心这一点,fetechresultcontroller每次调用后调用。
希望这对某人有所帮助。