gpt4 book ai didi

ios - 如何在持久存储更改后刷新 fetchedResultsController

转载 作者:可可西里 更新时间:2023-11-01 04:34:36 24 4
gpt4 key购买 nike

在编程方面,我是一个周末勇士,所以我可能做错了什么......

我有一个 Split View Controller 、核心数据、nsfetchedResultsController,一切都很好。我现在可以选择让用户创建 persistentStore.sqlite 文件的备份文件。当用户从备份文件恢复时,tableview 不反射(reflect)任何变化。最重要的是,从那时起无法从 TableView 添加/删除中进行任何持久更改。当我退出应用程序并重新启动它时,备份的所有数据都在那里并且一切正常。

如何强制 tableview 从 fetched results controller 获取现在的新信息?或者我该如何强制

以下是我迄今为止尝试过但未成功的一些散点:

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];
}

从 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;
}

即使这是我邻居的应用程序,我也不愿意告诉他在备份后终止并重新启动该应用程序...

解决方案 最终成为以下两个答案的组合,

- (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];
}

最佳答案

你有没有删除缓存?

您需要先将缓存名称设置为 fetchedResultsController(注意末尾的 cacheName 参数):

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:query
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"CACHE_NAME"];

然后在进行更新时删除缓存:

[NSFetchedResultsController deleteCacheWithName:@"CACHE_NAME"];

执行此操作后,通过执行以下操作再次从核心数据加载:

NSError *error;
if (![self.fetchedResultsController performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error loading data %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[self.tableView reloadData];

关于ios - 如何在持久存储更改后刷新 fetchedResultsController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26478785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com