NSPersistentStoreDidImportUbiquitousContentChangesNotification 未在任一 iOS 设备上触发

Posted

技术标签:

【中文标题】NSPersistentStoreDidImportUbiquitousContentChangesNotification 未在任一 iOS 设备上触发【英文标题】:NSPersistentStoreDidImportUbiquitousContentChangesNotification not fired on either iOS device 【发布时间】:2013-03-03 22:13:49 【问题描述】:

我已经使用 SQLite 日志设置了核心数据以与 iCloud 一起使用,我同时打开了核心数据和 SQLite 日志并在我的架构中达到了 3 级,这些都不会在从我的本地获取或放置数据时产生错误存储或云存储。

我的本​​地存储存储所有 SQLite 数据,而云存储配置为仅移动 2 个实体,因为所有本地存储都不需要更新。

当记录持久存储时,它们都会出现。

在 developer.icloud.com 上,该文件夹用于存储数据,有两个子文件夹(一个用于 iPad,另一个用于 iPhone)。每个文件夹中都有两个子文件夹和一个receipt.0.cdt 文件。

即使一切似乎都已设置好,但当我在应用程序中操作两个实体之一时,NSPersistentStoreDidImportUbiquitousContentChangesNotification 永远不会被触发(在任一设备上)。

即使本地数据存储(保存所有实体的本地副本)已更新并且此更改会反映在 UI 中。

这里是被操纵的商店(在操纵发生时记录)

2013-03-03 22:02:49.826 Clueless[1168:907] MOC P-Stores: (
        "<NSSQLCore: 0x1d5b1180> (URL: file://localhost/private/var/mobile/Library/Mobile%20Documents/<id~com~company~appname>/Data.nosync/CategoryModel.sqlite)",
        "<NSSQLCore: 0x1d5ca280> (URL: file://localhost/var/mobile/Applications/EEBE0D5E-1AC0-4A11-AA4B-FB9A63A7F95A/Documents/CategoryModel.sqlite)"
    )

以下是我操作实体后产生的数据日志:

2013-03-03 22:02:49.836 Clueless[1168:907] CoreData: sql: BEGIN EXCLUSIVE
2013-03-03 22:02:49.839 Clueless[1168:907] CoreData: sql: UPDATE ZIMAGEANSWERAVAILABILITY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.842 Clueless[1168:907] CoreData: details: SQLite bind[0] = (int64)2
2013-03-03 22:02:49.844 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)18
2013-03-03 22:02:49.845 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)1
2013-03-03 22:02:49.851 Clueless[1168:907] CoreData: sql: UPDATE ZIMAGEANSWERAVAILABILITY SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.861 Clueless[1168:907] CoreData: details: SQLite bind[0] = (int64)2
2013-03-03 22:02:49.863 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)13
2013-03-03 22:02:49.865 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)1
2013-03-03 22:02:49.866 Clueless[1168:907] CoreData: sql: UPDATE ZSYMBOL SET ZANSWERSTATE = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2013-03-03 22:02:49.868 Clueless[1168:907] CoreData: details: SQLite bind[0] = 2
2013-03-03 22:02:49.870 Clueless[1168:907] CoreData: details: SQLite bind[1] = (int64)2
2013-03-03 22:02:49.875 Clueless[1168:907] CoreData: details: SQLite bind[2] = (int64)8
2013-03-03 22:02:49.878 Clueless[1168:907] CoreData: details: SQLite bind[3] = (int64)1
2013-03-03 22:02:49.880 Clueless[1168:907] CoreData: sql: COMMIT
2013-03-03 22:02:49.909 Clueless[1168:907] CoreData: sql: pragma page_count
2013-03-03 22:02:49.911 Clueless[1168:907] CoreData: annotation: sql execution time: 0.0026s
2013-03-03 22:02:49.913 Clueless[1168:907] CoreData: sql: pragma freelist_count
2013-03-03 22:02:49.915 Clueless[1168:907] CoreData: annotation: sql execution time: 0.0021s

这真的让我很困惑,因为在向数据存储加载或添加数据时不会产生任何错误,所以理论上它应该可以工作。

非常感谢您的帮助!!

【问题讨论】:

嗯,显而易见的问题是,您确定您正在收听通知吗?而不是以某种方式取消注册? 是的,没有取消注册 - 观察者与所有其他核心数据一起在应用程序委托上。收据.0.cdt 文件都只有 1kb,所以我想知道是否有任何东西首先移动到云中 【参考方案1】:

对于仍在试图弄清楚为什么他们没有收到此通知的人:将通知的名称提供为常量而不是字符串(Swift 中的代码)。

不要这样做:

"NSPersistentStoreDidImportUbiquitousContentChangesNotification"

改为:

NSPersistentStoreDidImportUbiquitousContentChangesNotification

【讨论】:

【参考方案2】:

在我看来,您的数据库存储是为 iCloud 创建的,但没有放入任何内容。

receipt.0.cdt 文件出现在通过 iCloud 使用该应用程序的每台设备的事务日志文件夹中,但仅在最初出现(在创建商店时,或从另一台设备连接到现有商店时)。实际包含数据的事务日志命名更像:

FFFE99DC-87D7-5CBE-BFD8-32E11-D3E934.1.cdt

并且大小与该事务中插入/更新/删除等记录的数量成正比。这些事务日志出现在与生成这些事务的设备相关的 iCloud 设备文件夹中。

已为该应用连接到 iCloud,但未执行任何自己的交易的设备将只包含receipt.0.cdt 文件。

如果您解压缩receipt.0.cdt,您最终会得到一个文本文件——所有这些似乎都包含对生成这些事务日志的设备的引用(尽管最初是空的)。

mobile.DEVICE_ID:NUMBER_OF_TRANSACTIONS

然后这显示:

mobile.DEVICE_TWO:2:mobile.DEVICE_ONE:4

因此,receipt.0.cdt 只是针对连接到 iCloud 中该商店的每台设备记录的交易数量的内务参考。

专注于确保您确实将数据放入您的 iCloud 存储(使用正确的上下文,不会与本地存储上下文等混淆),然后实际保存它。

如果这些都不起作用,请尝试吹走整个 iCloud 容器并重新开始,以防万一您的 ubiquity 存储中出现问题(对几乎所有核心​​数据 iCloud 难题的标准响应!)。

【讨论】:

知道为什么只有在我启动应用程序时才会触发通知,而在此之后,当我在另一台设备上更新 iCloud 数据时不会再触发通知?我激活了日志记录,我看到更新到达(控制台中有很多日志记录,显然没有错误)但是没有任何通知被触发并且当我获取数据时没有更新。它只会在下次应用启动后更新。

以上是关于NSPersistentStoreDidImportUbiquitousContentChangesNotification 未在任一 iOS 设备上触发的主要内容,如果未能解决你的问题,请参考以下文章