NSFetchedResultsController(和 UITableView)委托方法调用越来越多
Posted
技术标签:
【中文标题】NSFetchedResultsController(和 UITableView)委托方法调用越来越多【英文标题】:NSFetchedResultsController (and UITableView) delegate methods calls growing and growing 【发布时间】:2015-09-08 18:03:01 【问题描述】:设置:带有 FRC 的 UITableView。行是文本内容的简单列表,用户可以拉动以刷新以获取最新信息。
我看到每行多次调用 cellForRow 的奇怪行为。所以我看到它为 0,0 0,1 0,2 0,3(可见行),但是这 4 行都有 cellForRow 被多次调用。但是第一次查看列表时,它们会被调用一次。第二次,两次,等等。到第 7 次,用户看到内容后,在幕后继续一遍又一遍地尝试配置单元格,最终崩溃。
因此,如果您访问任何内容列表,它会访问服务器、下载故事、创建 NSMO 并显示。在日志中,我看到为每个可见行调用了一次 configureCell。如果我刷新,我会看到同样的结果。但是,如果我导航到不同的屏幕,然后回来,当我拉动刷新时,我注意到每行都会调用 cellforrow 两次。如果我继续这个离开和回来的过程,每次我这样做,cellforrow 都会被称为一个额外的时间。记录一些获取的结果控制器委托方法,我在每组 cellforrow 调用之前看到 willchangecontent。有人可以帮我确定为什么我的 cellforrow 方法被调用的次数越来越多吗?
一个想法是我设置 FRC 的方式。我遵循 CoreDataBooks 之类的代码并将内容移至 viewdidload,但仍然看到问题。
我在 .h 中有一个属性,在 .m 中有我认为的标准设置:
- (NSFetchedResultsController *)fetchedResultsController
//NSLog(@"fetchedresulscontroller");
if (_fetchedResultsController != nil)
return _fetchedResultsController;
// initialize fetch request. setup predicate, sort, etc.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"date" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
// perform actual fetch. delegate methods take it from here
NSError *fetchError = nil;
if (![self.fetchedResultsController performFetch:&fetchError])
// 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 %@, %@", fetchError, [fetchError userInfo]);
abort();
return _fetchedResultsController;
【问题讨论】:
我怀疑这可能与您运行NSFetchedResultsController
? 时有关。它属于哪种 TVC 生命周期方法?
那么你有一个将 FRC 保存在内存中的局部变量吗?另外你什么时候设置 FRC - 也就是说 - 你的代码的哪一部分会发生这种情况?
我有一个属性,然后在上面发布的 - (NSFetchedResultsController *)fetchedResultsController 中设置 FRC。谢谢!
你是对的。 self.fetchedResultsController = aFetchedResultsController 只是我设置它的地方。是的,然后我在类似 numberOfSections 这样的地方使用它: return [[self.fetchedResultsController section] count];这证实了你的怀疑?非常感谢
所以我通常在 viewDidLoad
TVC 生命周期方法中为 FRC 设置本地属性。尝试一下,看看是否有帮助...
【参考方案1】:
andrewbuilder 是在正确的轨道上。这一切都与 FRC 有关,但诀窍是用于菜单的第三方 SWReveal 库。事实证明,我每次都在创建一个新的 VC(以前没有释放),FRC 正在查看所有实时视图控制器。因此,每次我从菜单中点击一个选项时,都会添加另一个选项并为此调用配置调用。
解决方案是在 viewwilldisappear 中取消 FRC 委托并在 viewwillappear 中设置它
【讨论】:
以上是关于NSFetchedResultsController(和 UITableView)委托方法调用越来越多的主要内容,如果未能解决你的问题,请参考以下文章