【发布时间】:2019-08-09 11:24:12
【问题描述】:
我需要在导入发生后观察Entity 的变化。
目前我有下一个逻辑:
- 将带有临时标识符 (
NSManagedObject.objectId) 的Entity保存到本地核心数据存储中。 - 通过
AlamofirePOST请求将Entity发送到服务器。 - 服务器生成 JSON 并使用几乎相同的实体详细信息进行回复,但使用修改后的标识符(之前为
NSManagedObject.objectId)。因此本地的一个实体 id 将使用服务器 id 进行更新。 - 现在,当我收到新的 JSON 时,我会使用
transaction.importUniqueObjects。
在这一步,我想通知我的数据源有关更改。并使用更新的标识符重新获取数据。
所以我的DataSource 在一个数组中有一些Entities,虽然我使用这个数据源来显示数据,但它仍然是我之前获取的那个数组中的静态信息,但是正如你在第 4 步中看到的那样,我已经更新了通过CoreStore导入核心数据存储,并希望DataSource的数组也能更新。
我在 CoreStore 中找到了一些关于 ListMonitor 的信息并尝试使用它。正如我所见,此方法在更新到来时有效
func listMonitorDidChange(_ monitor: ListMonitor)
但我尝试以某种方式重新获取数据。看起来监视器已经包含一些最新信息。
但是当我这样做时:
func listMonitorDidChange(_ monitor: ListMonitor<MyEntity>) {
let entities = try? CoreStore.fetchAll(
From<MyEntity>()
.orderBy(.ascending(\.name))
) // THERE IS STILL old information in database, but monitor instance shows new info.
}
然后代码变成了这样:
func listMonitorDidChange(_ monitor: ListMonitor<MyEntity>) {
var myEntitiesFromMonitor = [MyEntity]()
for index in 0...monitor.numberOfObjects() {
myEntitiesFromMonitor.append(monitor[index])
}
if myEntitiesFromMonitor.count > 0 {
// HERE we update DataSource
updateData(with: myEntitiesFromMonitor)
}
}
不确定我是否走对了。
【问题讨论】:
-
为什么需要在(托管)对象中存储一个额外的数组?监视器正在为您保存和更新它们,这就是您首先拥有它的原因。让您的数据源使用监视器来访问数据,而不是其他任何东西,否则您很容易遇到不一致的崩溃。
-
好吧,让我看看。我刚刚通过 fetchAll 获取对象,但是是的,我想通过监视器处理对象是有意义的。
-
@MartinM 感谢您的建议!您的答案和 cmets 总是很有帮助!我之前考虑过这个问题。现在可以了,只是小问题可以通过监视器搜索吗?看起来应该有一些使用
.where条件的过滤器功能。只是想知道每次使用新的.where条件重新初始化监视器都会很昂贵,例如每次我在搜索字段中输入字母以使用新数据更新表格视图时。
标签: ios swift core-data corestore