从 iOS 15.0 同步 CloudKit 后,CoreData 中的关系为零

2024-02-16

我正在为一个新应用程序开发 PoC,但我遇到了两个 CoreData 实体的问题InboxItem and CardSet,它们中的每一个都具有可选的“对一”关系。当我在模拟器中启动应用程序并创建这些实体时,模拟器数据库和 CloudKit 仪表板中的一切看起来都很好,即两个关系都已设置。但是,当我随后在 iPhone 上运行该应用程序并等待这些新记录同步并随后访问关系时,会出现错误,说明以下关系:InboxItem to CardSet was nil。看来这种关系没有正确同步“下游”(从 CloudKit 到 CoreData/iCloud 到设备)。

当 CoreData 通过 CloudKit 导入最近的更改时,日志控制台显示以下与缺失关系相关的调试输出:

Importing updated records:
(
    "<CKRecord: 0x7faf0d820ac0; recordType=CD_Card, recordID=89A3FE22-1CC4-447D-BFF0-515E80933551:(com.apple.coredata.cloudkit.zone:__defaultOwner__), recordChangeTag=5, values={\n    \"CD_cardSet_\" = \"5EED257A-8EF8-4749-93EF-CE2882F52C0C\";\n    \"CD_entityName\" = Card;\n    \"CD_id_\" = \"5F2FB4B7-A236-48F5-B2F9-FC2520C29765\";\n    \"CD_language_\" = \"\\Ud83c\\Udde9\\Ud83c\\Uddea\";\n    \"CD_line1_\" = \"\";\n    \"CD_line2_\" = \"\";\n    \"CD_line3_\" = \"\";\n}>",
    "<CKRecord: 0x7faf0d822260; recordType=CD_CardSet, recordID=5EED257A-8EF8-4749-93EF-CE2882F52C0C:(com.apple.coredata.cloudkit.zone:__defaultOwner__), recordChangeTag=4, values={\n    \"CD_entityName\" = CardSet;\n    \"CD_id_\" = \"E4460BCE-CB08-4DDA-8DDC-1BCC23649A91\";\n    \"CD_inboxItem_\" = \"212D86EC-635E-4903-BF51-85B0F36C401B\";\n}>",
    "<CKRecord: 0x7faf0d815830; recordType=CD_InboxItem, recordID=212D86EC-635E-4903-BF51-85B0F36C401B:(com.apple.coredata.cloudkit.zone:__defaultOwner__), recordChangeTag=3, values={\n    \"CD_addedOn_\" = \"2022-02-21 19:44:51 +0000\";\n    \"CD_capturedText_\" = \"Simulator 1\";\n    \"CD_cardSet_\" = \"5EED257A-8EF8-4749-93EF-CE2882F52C0C\";\n    \"CD_entityName\" = InboxItem;\n    \"CD_id_\" = \"68FA5FB8-2752-4E14-AA4C-C82F20215678\";\n}>",
    "<CKRecord: 0x7faf0db06280; recordType=CD_Card, recordID=64324445-8E07-4D20-8212-2491E564530D:(com.apple.coredata.cloudkit.zone:__defaultOwner__), recordChangeTag=6, values={\n    \"CD_cardSet_\" = \"5EED257A-8EF8-4749-93EF-CE2882F52C0C\";\n    \"CD_entityName\" = Card;\n    \"CD_id_\" = \"786AED19-F00C-4694-8978-897FA34E81F9\";\n    \"CD_language_\" = \"\\Ud83c\\Uddec\\Ud83c\\Udde7\";\n    \"CD_line1_\" = \"\";\n    \"CD_line2_\" = \"\";\n    \"CD_line3_\" = \"\";\n}>"
)
Deleted RecordIDs:
{
}
CoreData: debug: CoreData+CloudKit: -[PFCloudKitSerializer updateAttributes:andRelationships:onManagedObject:fromRecord:withRecordMetadata:importContext:error:](1460): Adding mirrored relationship to link for record <CKRecordID: 0x600002e5e3a0; recordName=89A3FE22-1CC4-447D-BFF0-515E80933551, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__> related to 5EED257A-8EF8-4749-93EF-CE2882F52C0C by cardSet_
CoreData: debug: CoreData+CloudKit: -[PFCloudKitSerializer updateAttributes:andRelationships:onManagedObject:fromRecord:withRecordMetadata:importContext:error:](1460): Adding mirrored relationship to link for record <CKRecordID: 0x600002e5ebc0; recordName=5EED257A-8EF8-4749-93EF-CE2882F52C0C, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__> related to 212D86EC-635E-4903-BF51-85B0F36C401B by inboxItem_
CoreData: debug: CoreData+CloudKit: -[PFCloudKitSerializer updateAttributes:andRelationships:onManagedObject:fromRecord:withRecordMetadata:importContext:error:](1460): Adding mirrored relationship to link for record <CKRecordID: 0x600002e41d00; recordName=212D86EC-635E-4903-BF51-85B0F36C401B, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__> related to 5EED257A-8EF8-4749-93EF-CE2882F52C0C by cardSet_
CoreData: debug: CoreData+CloudKit: -[PFCloudKitSerializer updateAttributes:andRelationships:onManagedObject:fromRecord:withRecordMetadata:importContext:error:](1460): Adding mirrored relationship to link for record <CKRecordID: 0x600002e42180; recordName=64324445-8E07-4D20-8212-2491E564530D, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__> related to 5EED257A-8EF8-4749-93EF-CE2882F52C0C by cardSet_
CoreData: debug: CoreData+CloudKit: -[NSCloudKitMirroringDelegate managedObjectContextSaved:](2504): <NSCloudKitMirroringDelegate: 0x6000015d0dd0>: Observed context save: <NSPersistentStoreCoordinator: 0x6000005c9c00> - <NSManagedObjectContext: 0x600001584a90>

有问题的收件箱项目是具有记录 ID 的收件箱项目212D86EC-635E-4903-BF51-85B0F36C401B(上面更新的记录的第三个)。也就是说,它显然是导入的,并且也创建了关系(请参阅根据Adding mirrored relationship to link for record声明)。

更新1:似乎是一个计时问题: NSFetchRequestResult.controllerDidChangeContent (我当前执行引发上述错误的检查)似乎被调用得太早 - 即在 CoreData/Coudkit 同步完成之前 - 特别是在建立关系之前。如果我在执行检查之前等待 5 秒,则不会发生错误...同时调试日志显示

CoreData: debug: CoreData+CloudKit: -[PFMirroredOneToManyRelationship updateRelationshipValueUsingImportContext:andManagedObjectContext:error:](440): Linking object with record name <CKRecordID: 0x600001a8a9e0; recordName=212D86EC-635E-4903-BF51-85B0F36C401B, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__> to <CKRecordID: 0x600001a8a740; recordName=5EED257A-8EF8-4749-93EF-CE2882F52C0C, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__> via cardSet_

有什么想法如何避免这种情况吗?当我第一次开始研究这个问题时(几个月前),它成功了。从那以后我没有改变任何事情。也许随着 iOS 15 的推出,行为发生了变化?

更新2:使用 iOS 14.5 运行模拟器时不会出现此问题,因此该行为已在 iOS 15.0 和 iOS 15.2 之间的某个位置引入(我将在稍后详细检查)。问题是,这是有意还是无意的行为?从我的角度来看,实体和关系现在是在单独的步骤中更新的(上下文被保存两次),这同时导致了不一致的状态。还有其他人遇到过这样的问题吗?

更新3:从 iOS 15.0 开始出现此问题。


我面临着同样的问题。这很烦人,因为您不能再依赖数据的完整性。我因此导致了很多崩溃,因为我的关系永远不应该为零,这就是我在代码中的假设。

根据我的观察,该问题似乎仅在大型 CloudKit 导入期间发生,主要是在新设备上安装应用程序并下载 CloudKit 中存储的所有记录时(在我的情况下大约有 3000 条记录)。在这种情况下,导入过程似乎调用save() on the viewContext在导入过程中多次(也许这样就不必重新开始?)。当然,这会触发任何 FetchedResultsController,但并非所有关系都已正确设置。

长话短说,我现在的解决方法是当我从 FetchController 获取新数据时手动检查数据的完整性,例如像这样的东西:

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    guard let newObjects = fetchController.fetchedObjects as? [MyCoreDataObject] else {
        return
    }

    let validObjects = newObjects.filter { $0.relationship != nil }

    // Use validObjects
}

当我有时间的时候,我会尝试准备一个示例项目来说明这个问题,并向 Apple 工程师开一张票,看看这是否真的是有意为之的行为还是一个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 iOS 15.0 同步 CloudKit 后,CoreData 中的关系为零 的相关文章

  • 快速钥匙串更新只有在第二次尝试时才起作用

    您好 我在更新存储在钥匙串中的登录信息方面遇到了 iOS 钥匙串的一个非常奇怪的问题 因此 如果没有保存的凭据 则正确运行保存函数会保存登录信息 如果登录信息已存在并且用户更新了密码 则更新功能仅正确更新密码 但是 如果登录信息存在并且我尝
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • 保存来自 TrueDepth 相机的深度图像

    我正在尝试保存 iPhone X TrueDepth 相机的深度图像 使用AVCam照片滤镜 https developer apple com library content samplecode AVCamPhotoFilter Lis
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 二元运算符“/”不能应用于两个(Int)操作数[重复]

    这个问题在这里已经有答案了 我得到了Binary operator cannot be applied to two Int operands当我将以下代码放入 Xcode 中的 Swift Playground 时出错 func sumO
  • 针对 iOS 10.3 进行编译,但模块“SwiftUICharts”的最低部署目标为 iOS 13.0

    知道如何仅在 iOS 版本超过 iOS 13 时导入 SwiftUICharts 框架吗 我通过 文件 gt Swift 包 gt 添加包依赖项 添加了此框架 我的应用程序目标必须是 iOS 10 我将此框架导入到 swiftui 控制器中
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前
  • 在 React Native 中将 Swift 事件发送到 Javascript 的正确流程

    我一直在尝试使用 Swift 构建全面的蓝牙功能 我目前陷入了如何将事件从 Swift 发送回 React Native 的困境 我尝试过this https stackoverflow com questions 31870775 rea
  • 核心数据对多关系。它们是延迟加载吗?

    我在核心数据 适用于 iPhone 中有典型的模型 其中包含部门和员工 部门 gt gt 员工 我不想每次加载时都加载一个部门的所有员工 所以我想将员工创建为获取的属性 我想我可以定义一些像这样的谓词 employee deparmentI
  • 调用 SwiftUI 中位置 #11、#12 处的额外参数 [重复]

    这个问题在这里已经有答案了 我在 SwiftUI 中的切换开关上不断收到 调用中位置 11 12 处有额外参数 错误 我见过其他人有 调用中的额外参数 错误 但答案似乎没有帮助 另外 我的错误是 位置 11 12 我还没有看到其他人发生这种
  • 以编程方式从底部裁剪图像

    我正在开发自定义相机应用程序 一切进展顺利 但我在从底部裁剪图像时遇到了问题 即 裁剪后的图像与原始图像具有完全相同的宽度 但高度将为原始图像的 1 3 并且必须从底部开始 斯威夫特3解决方案 func cropBottomImage im
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • Swift Codable 将空 json 解码为 nil 或空对象

    这是我的代码 class LoginUserResponse Codable var result String var data LoginUserResponseData var mess String public class Log
  • 在 SwiftUI 中使用分段式选取器在两个页面之间滑动

    我有一个Picker with pickerStyle SegmentedPickerStyle 使其成为分段控件 我想让页面在之间平滑滑动 而不是使用条件语句替换视图 这是我迄今为止所做的 gif 这是到目前为止的代码 由if 而不是在不
  • 当 UITextField 已满或空时显示警报 Swift

    下面的代码中 如果 userNameTF 或 passwordTF 已满或为空 则会显示警报 IBAction func LoginBtn sender AnyObject let userName userNameTF text let
  • 为什么我不能在 Realm 属性上使用 private

    我正在尝试在 RealmSwift 中存储一个枚举案例 但 Realm 不支持枚举 本文 https medium com it works locally persisting swift enumerations with realm
  • 在真实设备上展示测试广告

    这是我的代码 let request GADRequest request testDevices kGADSimulatorID XXXX2F32d69CCA859FFB559D0FEA3CF6483D08A6 adView load r
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码

随机推荐

  • 向 UIAppFonts 添加多种字体会相互覆盖

    我正在尝试通过以下方式向 iPhone 应用程序添加一些自定义字体UIAppFonts in Info plist 我可以通过代码访问这两个字体名称 即MyFont Bold and MyFont Medium 我的问题是最后一个字体UIA
  • 如何验证nestjs中的查询参数

    哟 我有 Nestjs 的商店应用程序 我需要验证 mongo id 这是通过查询传递的 问题是我也传递和搜索查询 我编写了验证所有值的管道 并排除了此搜索查询 Injectable export class ValidationObjec
  • Ada 通用平均函数

    我有一个函数可以对记录数组中的某个数值进行平均 该值可以是自然类型增量 也可以是枚举类型增量 我让它正确地总结了这些值 但我的问题是 如何将数组的长度转换为通用类型 以便它可以除以整数和增量类型数字 在记录数组上使用 长度 属性 这样做的优
  • Android 上的 Google 地图无法加载

    我的应用程序中有一个可用的 Google 地图 但我必须开始使用另一台计算机 所以我用 Android Studio 等在这台新电脑上下载了我的源代码 现在 我无法再让 Android 地图显示了 我在 Google Console 中从我
  • Hibernate 从多个表中计数

    我想编写一个 HQL 查询 从不同列的 4 个表中返回特定计数 我有4张桌子 Tab1 Tab2 Tab3 and Tab4 我想得到这样的东西 Tab1 Tab2 Tab3 Tab4 1 13 7 0 所有记录在Tab 有自己的id an
  • 如何在用 C 编写的类似 FORTH 的语言解释器中实现 LOOP

    我正在用 C 编写一种简单的基于堆栈的语言 并且想知道应该如何实现某种类型的循环结构和 或前瞻符号 由于此页面的代码有点长 超过 200 行 所以我将其放入GitHub 存储库 https github com tekknolagi Sta
  • 如何在 C# 中混合两个视频流?

    过去 我使用 Managed Direct X 和 DirectShow Net 将视频播放到简单网格上的纹理 然后 我使用相同的技术将多个视频源组合成单个纹理 并使用通过纹理公开的各种功能将这些流混合在一起 这是 2 年前的一个非常有趣的
  • Java 中 int 与 float 算术效率

    我正在编写一个应用程序 它使用 Dijkstra 算法来查找图中的最小路径 图中节点和边的权重为float数字 因此该算法对浮点数进行许多算术运算 如果我将所有重量转换为int是 Java中int算术运算比float算术运算更快吗 我尝试编
  • 用于添加应用程序的 Windows Azure Graph API

    我正在尝试使用 Windows Azure Active Directory WAAD 图形 API 将应用程序添加到我的 WAAD 租户 我已成功使用 API 创建用户 使用 API 添加应用程序时 我收到授权异常 Authorizati
  • 基于视图的 NSOutlineView 标题单元格字体问题

    我目前正在尝试在我的 Cocoa 应用程序中使用新的基于视图的 NSOutlineView 由于我没有使用绑定 因此我在控制器中实现了所有必需的委托和数据源方法 在界面生成器中 我添加了一个 NSOutlineView 其突出显示设置为来源
  • 如何使用 MATLAB 找到两个斑点(轮廓/闭合曲线)之间的最短路径?

    bwlabel可用于获取图像中断开连接的对象 L Ne bwlabel image 如何计算两条不连通的闭合曲线之间的最短路径 有实际的 非理论的 解决方案吗 建议1 尝试提取要连接的对象的周边像素的坐标 并将它们用作图形中的节点 然后使用
  • Xamarin iOS 构建的 DevOps CI 错误 在钥匙串中找不到有效的 iOS 代码签名密钥

    我已经为我的 Xamarin iOS 应用程序创建了 YAML 构建配置 并提供了证书文件 p12 和 mobileprovision 但是当管道运行时 它在应用程序的构建步骤中失败 证书安装通过 Note具有相同证书文件和密码的构建在应用
  • Keras 中的回调异常 - Tensorflow 2.0 - Python

    以下代码在与 Keras 打包的 MNIST 数据上运行顺序 Keras 模型 非常简单 在运行以下代码时 我遇到异常 该代码很容易重现 import tensorflow as tf class myCallback tf keras c
  • 有没有办法获取 Visual Studio 使用的构建命令行?

    我想从命令行进行构建 但我想从 Visual Studio 2012 获取确切的命令行语法 这样我就不必手动找出所有标志 导入和其他参数 有没有办法让 Visual Studio 显示这些信息 在 Visual Studio 中生成项目或解
  • 使用 Service Worker 处理离线时的文件上传

    我们有一个 Web 应用程序 使用 AngularJS 构建 我们也逐渐添加 PWA 功能 服务工作线程 可启动项 通知等 我们的网络应用程序的功能之一是能够在离线状态下完成网络表单 目前 我们在离线时将数据存储在 IndexedDB 中
  • Mongoid embeds_many:推送文档而不保存以保留脏状态

    在 Mongoid 中 将文档推送到embeds many关系自动将文档保存到数据库中 通常 这很好 但是当我需要跟踪嵌入文档的更改时 我会遇到问题 假设您有两个模型 class List include Mongoid Document
  • 从函数 React Native 获取字符串结果

    我创建了一个连接到 redux 并返回当前加载的组件item sname 作为导航标题 但是当我尝试从此组件获取标题时 它会出现以下错误 Error title cannot be defined as a function in navi
  • 不支持的major.minor版本51.0(无法加载类org.postgresql.Driver)

    使用maven创建一个Web应用程序并将其部署在heroku上 一切正常 但当我调用使用 postgresql 9 2 1002 jdbc4 驱动程序的操作时 我得到 java lang UnsupportedClassVersionErr
  • Android Studio 3.5 原因:buildOutput.apkData 不得为 null Clean & Rebuild 已尝试

    在我将 Android Studio 3 4 更新到 3 5 并想要构建签名 APK 后 我收到错误 原因 buildOutput apkData 不能为 null 错误 我已经尝试过清理和制作项目以及清理和重建项目 但没有成功 我正在使用
  • 从 iOS 15.0 同步 CloudKit 后,CoreData 中的关系为零

    我正在为一个新应用程序开发 PoC 但我遇到了两个 CoreData 实体的问题InboxItem and CardSet 它们中的每一个都具有可选的 对一 关系 当我在模拟器中启动应用程序并创建这些实体时 模拟器数据库和 CloudKit