Mar*_*ark 5 core-data objective-c uitableview nsfetchedresultscontroller ios
我是编程方面的周末战士,所以我可能做错了什么...
我有一个拆分视图控制器,核心数据,nsfetchedResultsController,它们都很好用。现在,我可以为用户提供一个创建persistentStore.sqlite文件的备份文件的选项。当用户从备份文件还原时,表视图不会反映任何更改。最重要的是,此后不能在tableview的add / delete中进行任何持久的更改。当我退出应用程序并重新启动它时,所有数据都从备份那里备份,并且一切正常。
如何强制tableview从获取的结果控制器中获取最新信息?或者我该如何强迫
以下是到目前为止我没有成功尝试过的内容:
MasterViewController.m
- (void)viewDidLoad
{
context = [[OSCDStackManager sharedManager] managedObjectContext];
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadFetchedResults) name:OSFilesUpdatedNotification object:nil];
- (void)reloadFetchedResults:(NSNotification*)note {
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
if (note) {
[self.tableView reloadData];
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
NSError *error = nil;
[self.fetchedResultsController performFetch:&error];
[self.tableView endUpdates];
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
从tableview的手动刷新下拉菜单中...
-(void) updateTable{
context = [[OSCDStackManager sharedManager] managedObjectContext];
NSError *error = nil;
[self.fetchedResultsController performFetch:&error];
//[self.tableView endUpdates];
[self.tableView reloadData];
[self.refreshControl endRefreshing];
}
- (void)viewWillAppear:(BOOL)animated {
[self.tableView reloadData];
}
- (NSFetchedResultsController *)fetchedResultsController
{
context = [[OSCDStackManager sharedManager] managedObjectContext];
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
//[NSFetchedResultsController deleteCacheWithName:@"cache"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)
即使这是我邻居的应用程序,我还是不想告诉他在备份后杀死并重新启动该应用程序...
解决方案最终是以下两个答案的结合,
- (void)reloadFetchedResults{
self.fetchedResultsController = nil;
[NSFetchedResultsController deleteCacheWithName:@"cache"];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
消除你的 FRC
-(void)reloadData
{
NSError *error = nil;
self.fetchedResultsController = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
else
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
** 编辑 ** 如果前面的“自我”不明显,你需要在课堂上的某个地方
-(NSFetchedResultsController *)fetchedResultsController
{
if (!_fetchedResultsController)
{
_fetchedResultsController = [NSFetchedResultsController alloc]initWithFetchRequest:aFetchRequest
managedObjectContext:aManagedObjectContext // the main thread MOC
sectionNameKeyPath:nil cacheName:nil];
// addional FRC setup etc.
}
return _fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5147 次 |
| 最近记录: |