performFetch后fetchedObjects为nil,但tableView有数据
Posted
技术标签:
【中文标题】performFetch后fetchedObjects为nil,但tableView有数据【英文标题】:fetchedObjects is nil after performFetch, but tableView has data 【发布时间】:2016-11-19 15:00:31 【问题描述】:我有一个由Core Data
支持的工作UITableView
。
我现在正在实现一个功能,当表格为空时,我禁用rightBarButtonItem
:
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear: animated];
self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO;
但即使表格中有项目,self.fetchedResultsController.fetchedObjects
也会返回 nil,因此该按钮始终处于禁用状态。
我打电话给performFetch
viewDidLoad
。
我在 viewDidLoad 中尝试了这段代码,但同样的情况发生了。
为什么self.fetchedResultsController.fetchedObjects
为零,即使表格已填充?
EDIT添加了更多代码
项目在显示表格之前立即生成到子上下文中。 fetchRequest
使用相同的上下文。
这些项目肯定在上下文中,因为表中填充了子上下文中的项目。但是,当调用viewWillAppear
时,self.fetchedResultsController.fetchedObjects
仍然为零。
我就是这样称呼performFetch
(在viewDidLoad
):
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
NSError *error = nil;
if (![self.fetchedResultsController performFetch: &error])
NSLog(@"Failed to perform fetch: %@", error);
dispatch_async(dispatch_get_main_queue(), ^
[self.tableView reloadData];
);
);
我在显示 VC 之前保存上下文。
【问题讨论】:
请添加用于获取和 nsmanagedObjectContext 配置的代码。 【参考方案1】:您是否尝试过像这样在您的 dispatchBlock 中调用 self.fetchedResultsController.fetchedObjects
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
NSError *error = nil;
if (![self.fetchedResultsController performFetch: &error])
NSLog(@"Failed to perform fetch: %@", error);
dispatch_async(dispatch_get_main_queue(), ^
self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO;
[self.tableView reloadData];
);
);
【讨论】:
哇,好用。fetchedObjects
在显示表格后被删除肯定还有另一个原因。我会调查的。由于performFetch
代码在一个超类中,并且并非所有子类都有按钮,所以我需要稍微重构一下我的代码,但这应该不是问题。我现在也在检查self.fetchedResultsController.fetchedObjects.count
,因为fetchedObjects
可能存在但为空。
问题是您正在异步队列中获取数据,这将需要一些时间,并且您在 viewWillAppear 中使用self.fetchedResultsController.fetchedObjects
,可能当时没有获取结果
是的,我也在考虑这个问题。但是表格仍然被填充,所以延迟必须非常非常短。当我实际将按钮启用代码放在viewDidAppear
中时,它起作用了,但是首先出现了视图,然后按钮变暗了,看起来不太好。现在一切正常。
很高兴它有帮助:)以上是关于performFetch后fetchedObjects为nil,但tableView有数据的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultsController `performFetch:` 结果不再排序
NSFetchedResultsController:在调用 -performFetch 之前,我是不是应该始终检查 fetchedObjects==nil?
CoreData、NSFetchedResultsController 和 performFetch:
NSFetchedResultsController“无法在-performFetch之前访问获取的对象:”调用objectAtIndexPath时崩溃: