【发布时间】:2013-12-16 06:07:23
【问题描述】:
我正在编写一个使用多个 NSFetchedResultsControllers (FRC) 的应用程序,每个应用程序用于我的数据模型中的不同托管对象子类。其中几个 FRC 是 UITableViewControllers 的一部分,但有几个不是。我有两个问题:第一,当我向 MOC 添加新对象时,为什么我的一个 FRC 没有更新,第二,我是否应该为此目的使用 FRC?我认为这可以让我不必在所有代码中都放入 fetch 请求,但也许只有将 FRC 与 tableview 或其他此类对象一起使用才有意义。
所以,这里是详细信息。
不与tableview 绑定的 FRC 之一是跟踪时间表的 FRC。 SetScheduleViewController 具有以下属性(以及其他属性),这些属性是通过父视图控制器传入的:
@property (weak, nonatomic) NSFetchedResultsController *scheduleFetchedResultsController;
@property (weak, nonatomic) NSManagedObjectContext *managedObjectContext;
这个 FRC 是由另一个对象(它维护一个指向它的强指针)通过以下代码创建的
- (NSFetchedResultsController *)scheduleFetchedResultsController {
if (_scheduleFetchedResultsController != nil) {
return _scheduleFetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Schedule" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *fRC = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
NSError *error = nil;
if (![fRC performFetch:&error]) {
IFLErrorHandler *errorHandler;
[errorHandler reportErrorToUser:error];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
self.scheduleFetchedResultsController = fRC;
return self.scheduleFetchedResultsController;
}
(顺便说一句:cacheName 设置为 nil 的原因是我似乎只能将缓存名称分配给此应用程序中的众多 FRC 中的一个,或者应用程序崩溃......如果只有一个 FRC 是给定一个缓存名称,其余的缓存名称设置为 nil,一切似乎都很好,尽管我担心没有缓存,随着持久存储大小的增长,性能可能会很糟糕......但这是另一回事)
在SetScheduleViewController 中,可以创建或删除计划,并在加载SetScheduleViewController 时加载最近创建的计划。创建计划时,会创建一个新的计划管理对象,然后将 MOC 保存如下:
Schedule *newSchedule= [NSEntityDescription insertNewObjectForEntityForName:@"Schedule" inManagedObjectContext:self.managedObjectContext];
newSchedule.start=newStartTime;
//etc
NSError *saveError;
if (![self.managedObjectContext save:&saveError]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", saveError, [saveError userInfo]);
abort();
这成功保存了新的 MO,但 FRC 没有更新...我已经检查了几种方法...例如,如果在保存新计划后我重新输入 SetScheduleViewController 并检查 @987654331 @count] 它没有增加。但是,如果我退出应用程序并再次打开它,你瞧,FRC 获取的对象计数会增加,并且新对象确实存在。
我应该注意到scheduleFetchedResultsController 没有分配代表,这与附加到tableviewcontrollers 的FRC 不同,它们都工作正常。我没有分配委托,因为据我所知,tableviewcontrollers 中的 FRC 委托方法仅在 FRC 更改内容时处理更新 tableview...我看不到任何刷新 FRC 本身的委托方法添加了一个新对象并保存了 MOC。
所以,我的两个问题又是:1) 为什么 FRC 不刷新(以及我如何让它刷新),2) 使用 FRC 来管理未绑定的托管对象的获取结果是否有意义到tableview,我是否应该在每次需要访问对象列表时简单地从 MOC 执行新的提取?
非常感谢任何帮助。
【问题讨论】:
标签: ios nsfetchedresultscontroller