gpt4 book ai didi

ios - NSFetchedResultsController 不会自动重新加载数据

转载 作者:行者123 更新时间:2023-12-01 16:41:30 24 4
gpt4 key购买 nike

我已经被困在一个错误上几个小时了,我希望有人能帮助我。

我有一个 View Controller ,它使用 NSFetchedResultsController 加载数据(我正在使用核心数据),它获取我所有在过去具有“日期”的对象,即日期 < 现在。我希望在用户眼前重新加载这些数据,因此当任务变为“过时”时,我使用 NSNotificationCenter 来触发表的重新加载。当对象日期触发时,我还会发送本地通知,然后它会移动到我刚刚解释的“完整” View Controller 中。

这是奇怪的部分......
当应用程序来自后台时,我切换到“完整对象”选项卡并且它们不显示。但是,如果我立即关闭应用程序并重新启动它,一切看起来都很完美。如果我在应该重新加载时位于“完整对象”选项卡上,则会发生完全相同的事情,但是如果在重新加载发生时我在另一个选项卡上并切换到它,这一切看起来都很完美。

据我所知,我的 NSFetchedResultsController 没有正确跟踪对托管对象上下文所做的更改。我确定这是我犯的一个简单错误,但我似乎找不到它!请帮忙。

- (void)viewDidLoad {
[super viewDidLoad];

// Setup table view
self.tableView = [[UITableView alloc] init];
self.tableView.separatorInset = UIEdgeInsetsZero;
self.tableView.tableFooterView = [[UIView alloc] init];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.backgroundColor = [UIColor clearColor];
[self.view addSubview:self.tableView];

NSError *error = nil;
[self.fetchedResultsController performFetch:&error];
if (error) {
NSLog(@"Error: %@", error.localizedDescription);
}
}

#pragma mark - NSFetchedResultsController section

- (NSFetchRequest *)myFetchRequest {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"DBTask"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]];

NSPredicate *datePredicate = [NSPredicate predicateWithFormat:@"taskDate < %@", [NSDate date]];
NSPredicate *completePredicate = [NSPredicate predicateWithFormat:@"state == %d", DBTaskStateComplete];
NSPredicate *latePredicate = [NSPredicate predicateWithFormat:@"state == %d", DBTaskStateLate];
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:datePredicate, completePredicate, latePredicate, nil]];

[fetchRequest setPredicate:predicate];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"taskDate" ascending:YES]];
return fetchRequest;
}

- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}

DBCoreDataStack *coreDataStack = [DBCoreDataStack defaultStack];
NSFetchRequest *fetchRequest = [self myFetchRequest];
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:@"sectionName" cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
}
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}

最佳答案

这里的问题是日期[NSDate date]在您的日期谓词是在您的谓词初始化时生成的

该谓词不会主动跟踪 taskDate 与当前日期,而是跟踪创建谓词的日期。

在此处使用获取的结果 Controller 委托(delegate)可能不是实现此目的的最佳方法,您可以使用计时器,重置谓词并在每次计时器触发时执行新的获取。

关于ios - NSFetchedResultsController 不会自动重新加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23908388/

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