问题标签 [nspersistentcloudkitcontainer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nspersistentcloudkitcontainer - 带有 NSPersistentCloudKitContainer 的“NSAllocateMemoryPages() 失败”
问题描述:使用 NSPersistentCloudKitContainer 同步大型项目(例如图像)时,我的应用程序崩溃并出现错误“NSAllocateMemoryPages() failed”。这会在启动应用程序后的一分钟内反复发生。它发生在生产和开发环境中。
如果用户断开互联网连接或关闭我的应用程序的 iCloud 同步,则不会发生崩溃。
图像作为“二进制数据”存储在 Core Data 中,存储在与其父实体具有“多对一”关系的单独实体中。该设置改编自此示例:https ://developer.apple.com/documentation/coredata/synchronizing_a_local_store_to_the_cloud
重现步骤:一次将多个图像添加到核心数据,或与在私有 iCloud 容器中已有多个图像的 iCloud 帐户同步。
平台和版本:在运行 iOS 13.3.1 的 iPhone X 和 iPad Pro(第一代)上发生。
有没有其他人遇到过这个问题?所有的建议都将受到欢迎!
ios - 如何使用 NSPersistentCloudKitContainer 和 SwiftUI 手动获取 CloudKit 数据以更新 UI?
假设我们有一个工作的 NSPersistentCloudKitContainer 和一个名为 Item 的 CoreData 实体。假设我们想要在 iOS、iPad 和 Mac 应用程序之间进行同步。
我观看了这个关于同步 CoreData 和 CloudKit 的 WWDC 会议,并在我的 SwiftUI 应用程序中实现了基本同步。它可以工作,数据会到达所有 3 台设备并自动同步。
但是在 Mac 上,如果不重新加载视图(以及在模拟器中(因为它们没有收到推送通知),数据不会出现)。它来了,但没有自动刷新。我还测试了模拟器真实设备,有时它会自动同步,有时我需要重新打开应用程序才能看到更改。
我很好奇是否有可以与 NSPersistentCloudKitContainer 一起使用的强制获取方法。或者,也许有人知道在将 NSPersistentCloudKitContainer 与 SwiftUI 一起使用时手动重新获取数据的解决方法?
我还想在新数据开始出现时显示一个活动指示器,但不确定在哪里可以找到这个开始获取代码中的获取点?
我使用了 Apple 提供的这个 UIKit示例代码,并对其进行了调整以在 SwiftUI 中工作。我还阅读了这里的所有文档。
这是我使用的 persistentContainer 代码:
如果你看到了,我没有 在上面的代码中包含 container.viewContext.transactionAuthor = appTransactionAuthorName
and 。但我也尝试过他们并得到相同的结果。不确定我是否需要使用它们,因为在没有这些调用的情况下也可以进行同步。setQueryGenerationFrom(.current)
NotificationCenter.default.addObserver
在我的 Item 类中,我添加了这个函数来获取项目:
在我的 ContentView 我有这个 MasterView 视图:
PS我还注意到同步工作缓慢(也许这只是我的情况,不确定)。在与此代码同步之间,我必须等待 5 到 10 秒。也许有人知道这个等待时间是否正常?
core-data - 使用 NSPersistentCloudKitContainer 时如何将用户更新到新的 CloudKit 容器?
我有一个已经推送到生产的模型,我想将一个属性作为关系移动到一个新实体。
由此:
对此:
根据“更新您的生产模式”部分下的Apple Docs,我需要迁移到新的 CloudKit 容器,因为我们无法删除“生产”CKRecords 上的属性。
将用户迁移到一个全新的商店,使用 NSPersistentCloudKitContainerOptions 将新商店与新容器相关联。
我已经阅读了所有文档,以及我在 NSPersistentCloudKitContainer 上找到的每个博客,但没有一个真正涉及如何处理这个问题。
建议的解决方案
我需要为 2 个不同的容器(“旧”和“新”)提供 2 个变量。
注意: newPersistentContainer
会有一个“碰撞” containerIdentifier
,它也会执行核心数据迁移。
然后我想我需要手动移动所有记录oldPersistentContainer
并将它们添加到newPersistentContainer
. 将所有数据移入新容器后,我将删除其中的所有记录oldPersistentContainer
。就清理而言,这就足够了oldPersistentContainer
吗?
我花了一段时间才想出这个工作流程,我不确定这是处理这个问题的“正确”方式。这是我们应该如何使用 NSPersistentCloudKitContainer 处理容器迁移的方式吗?
swift - 强制 NSPersistentContainer 更改核心数据
我刚刚添加了一个选项,让用户在我的应用程序中切换云同步,我保存用户是否想在“useCloudSync”下的 UserDefaults 中使用 iCloud 同步。当应用程序运行时,我加载了我的 persistentContainer:
当用户使用 UISwitcher 切换云同步时,我更改了 UserDefaults 中“useCloudSyc”的值,但应用程序不会使用,NSPersistentCloudKitContainer
直到他们强制关闭应用程序并重新运行它。我希望在用户切换开关以开始从 iCloud 加载数据时更改容器。
NSPersistentCloudKitContainer
当用户切换“CloudSync”时,我该如何更改?
core-data - 如何在共享组容器中存储 CloudKit CoreData 实例?
如果您需要与应用扩展共享核心数据,将容器存储在共享组中会很有用。
swift - 如何在 macOS 应用程序上调试 Core Data Cloudkit 崩溃
我有一个核心数据 iOS 应用程序,它使用 Cloudkit 使用 NSPersistentCloudkitContainer - iOS 13 及更高版本。我在 iPad 和 iPhone 上测试过,同步效果很好。我现在尝试使用相同的 Cloudkit 容器(仍在开发中)将 Cloudkit 添加到类似的 Mac 应用程序中。这同样适用于同步,但通常在 iPad 上添加/删除实体会导致 Mac 崩溃,如下所示:
**libxpc.dylib`___xpc_activity_dispatch_block_invoke.109.cold.3:
-> 0x7fff70a14436 <+19>: ud2 **
我正在使用 NSFetchedResultsControllerDelegate,在 didChange 函数中进行了一些调试。有时我可以在崩溃之前看到一个问题,例如它说它将在第 6 行插入一个对象,而表本身只有 4 行。我并不总是收到这样的消息。
在 FetchedResultsControllerDelegate didChange 中,我将调试放在了开关的 .delete 部分。当表中只有 7 个时,我已经看到它试图删除第 8 项。我不让它这样做,但我最终没有删除我想要的项目。看起来 CloudKit 更改请求可能是以“错误”的顺序进入的?
请有人建议我如何进行调试?谢谢。
core-data - 特定 CKRecordZone 上的 NSPersistentCloudKitContainer
我正在研究将 iCloud 同步功能添加到基于 NSPersistentDocument 的应用程序的方法。
我可以为每个文档使用NSPersistentCloudKitContainer
和使用不同的吗?CKRecordZone
然后每个文档都会同步到 iCloud。
请注意,使用NSPersistentCloudKitContainer
是一项要求。
ios - 在后台获取 NSPersistentCloudKitContainer 更改以设置通知
我已将日期触发的本地通知添加到我的应用程序中,现在我希望用户能够在所有拥有该应用程序的设备上获取他们在一台设备上设置的通知。我将他们设置的通知保存在核心数据实体中(保存通知标识符和它应该被触发的日期)。该应用程序使用 NSPersistentCloudKitContainer 将用户设备同步在一起。
由于我将用户设置的通知保存到此 iCloud 容器中,有没有办法可以在应用程序的背景中收听 iCloud 更改,因此当在 iCloud 中添加通知时,我可以读取它并将其设置为其他本地通知设备?
您可以将此视为用户在 Apple 提醒应用程序中设置提醒,以及当我设置它时该通知如何在我的所有 iCloud 设备上弹出。我宁愿不制作任何类型的服务器来处理这个问题,因为我不熟悉使用服务器。
预先感谢您的帮助!
ios - 在 CloudKit 中处理未来模式更改的策略
我对 CloudKit 的理解是,如果用户有两台设备 - 一台具有具有 v2 架构的应用程序版本,而另一台具有 v1 架构的应用程序版本 - 具有 v1 架构的设备将接收新数据,但仅适用于 v1 中的字段。在架构 v2 中创建的新字段中的所有新数据都将针对该特定设备被丢弃。稍后,当具有 v1 架构的应用程序更新为 v2 架构时,在较新版本的应用程序上生成的 v2 字段中的新数据将不再被拉取,并且两个设备的数据不匹配。
这种理解来自讨论 NSPersistentCloudKitContainer(我正在使用的)的这篇博客。
这显然是一个问题,在第一个设备更新应用程序(例如 iPhone)和第二个设备更新应用程序(例如 iPad)之间可能有几天的时间。我可以在我的架构或实现中部署哪些策略来解决这个问题?