ios - NSFetchedResultController 在什么时候回更新数据?
巴扎黑
巴扎黑 2017-04-17 14:22:10
[iOS讨论组]

小弟的问题是这样的:我在写网络程序做缓存的策略是在网络数据请求下来之前生成NSFetchedResultController然后网络数据请求下来后更新数据库,借用NSFetchedResultController的机制对界面进行更新。可是奇怪的是当我把网络数据请求下来更新到数据库以后之前生成的NSFetchedResultController并没有更新,也没有调用代理方法通知视图更新。即便是我在网络更新数据以后手动调用一次performFetch其中的数据也不会更新。

更加奇怪的是,如果我在网络数据请求结束以后按照同样的配置再生成一个NSFetchedResultController此时就有数据。我很确定在无论是手动调用performFetch还是重新生成NSFetchedResultController对象之前,数据库的内容确实得到了更新,这是我用 SqlitePro 进行查看的。

通过查阅苹果文档,我只能得到这样的信息:

The results array reflects the in-memory state of managed objects in the controller’s managed object context, not their state in the persistent store. The returned array does not, however, update as managed objects are inserted, modified, or deleted.

也就是说,NSFetchedResultController只能显示内存状态,而不能表示持久对象的状态,可是。。。我既然已经把对象保存起来,上下文中的对象状态应该已经改变了啊,这种情况下我应该怎么理解NSFetchedResultController的更新机制?求大神解释 QAQ

巴扎黑
巴扎黑

全部回复(2)
巴扎黑

应该是负责存储的moc与负责展示的moc的状态不同步导致的,你有没有正确使用NSManagedObjectContextDidSaveNotification和mergeChangesFromContextDidSaveNotification:,相关内容可以搜索:Track Changes in Other Threads Using Notifications

伊谢尔伦

跟楼上说的差不多,frc大概是绑定一个moc并进行监听,当与其绑定的moc发生改变的时候就会发送通知让tableview进行对应刷新。。先确认下:
1)正确初始化了fetchedResultedController
2)实现了其代理方法
3)数据发生变化的moc是frc初始化时候method绑定的那个moc。

也就是说,NSFetchedResultController只能显示内存状态,而不能表示持久对象的状态,可是。。。我既然已经把对象保存起来,上下文中的对象状态应该已经改变了啊,这种情况下我应该怎么理解NSFetchedResultController的更新机制?

你改变了持久层的数据并不代表你改变了当前内存中moc中的数据。

另外吐槽下 fetchedResultController在多数据源、单(多)table的时候用起来就显得很累赘了。。。
还是只适合做简单的东西。。可以少写点代码。。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号