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)委托方法调用越来越多的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?