【问题标题】:Updating data while they are displayed and accessed in a TableView在 TableView 中显示和访问数据时更新数据
【发布时间】:2011-03-30 14:18:44
【问题描述】:

我正在尝试找出解决此问题的最佳方法。 首先,我在 UITableView 中显示了很多数据。这些数据可以通过点击访问(行的索引允许知道访问哪些数据)。 此外,我使用第二个线程更新和添加数据。第二个线程可以更改数据列表。

问题在于,在某些情况下,我可以访问数据(单击单元格),但在我将它们加载到 UITableView 和访问它们的那一刻之间,它已经被修改了。它可能导致点击错误的数据或已删除的数据,或 SegFault...

为了防止这种情况,我在加载 UITableView 时制作了一个不可变的数据副本,而 UITableView 和单元格仅引用该副本。

作为初学者,我使用 XML 和内存(不是 CoreData 或 SQLLite)来管理数据。现在我计划改变这个架构以使用 SQLLite(主要是为了持久性)。

我有两个问题:

  • 我能否使用 SQLLite 或 CoreData 机制来生成缓存副本(例如临时表)。我是否需要手动执行(插入到 desttable select * from sourcetable)或者是否有为我描述的目的而制作的东西?
  • 您认为使用 临时表 是做我想做的事的好方法吗?

感谢您的回答和帮助。

卡里姆

【问题讨论】:

  • 您的问题涵盖了我认为您应该尝试解耦​​的几个问题,例如不要将 UITableView(用户可见表)与数据库表混淆。修改数据的后台线程的性质是什么?它是从 ui 表中删除行还是附加它们?
  • 实际上第二个线程并没有改变tableview。为了简单起见:表格显示新闻提要,应用程序的全局新闻列表由第二个线程填充。重新加载 tableview 是通过用户操作完成的......
  • 战争新闻:使用 Core Data 和填充两个不同上下文的两个线程非常有效。请记住,第二个线程必须通知主线程 CD 更新!

标签: iphone database multithreading uitableview core-data


【解决方案1】:

CoreData 使用NSManagedObjectContext 跟踪内存中的所有更改,直到调用诸如save:rollbackreset 之类的方法。在一个单独的线程中,您可以创建另一个NSManagedObjectContext,它会更新所有数据,但在满足某些同步条件之前不保存任何数据(即用户不再编辑表)。满足所有条件后,您可以保存 NSManagedObjectContext 并重新加载表格。

注意:

使用核心数据的后台线程需要通知主线程发生变化。

Concurrency with Core Data

【讨论】:

  • 就是这样。 24 小时思考指南和教程得出了相同的结论:CoreData 就是为此而生的。感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多