,目前暂时用 NSManagedObjectID 代替 var title: String var taskCount: Int}在上面的实现中,我们用 NSManagedObjectID 作为 TodoGroup 的 id 类型,但由于 NSManagedObjectID 同样需要在托管环境中才能创建,因此在下文中,它将会被其他的自定义类型所取代。 0 ) }}两者间的纽带 —— WrappedID由于 NSManagedObjectID 的存在,上面的两个协议仍无法脱离托管环境( 并非指 Core Data 框架 )。 由于 WrappedID 需要符合 Sendable ,因此上面的代码在编译时将出现如下警告( NSManagedObjectID 不符合 Sendable ):image-20221128142739129 庆幸的是,NSManagedObjectID 是线程安全的,可以被标注为 Sendable( 这点已经在 Ask Apple 10 月的问答中得到了官方的确认[5] )。
使用 NSManagedObjectID 进行传递 因为托管对象是同托管它的上下文绑定在同一个队列上,因此,无法在不同队列的上下文之间传递 NSManageObject。 对于需要在不同的队列中对同一个数据记录进行操作情况,解决方式是使用 NSManagedObjectID。 NSManagedObjectID 作为托管对象的紧凑通用标识符,被广泛使用于 Core Data 框架中。 例如在批量操作、持久化历史跟踪、上下文通知等等方面都是以 NSManagedObjectID 作为数据标识的。但需要注意的是,它并不是绝对不变的。 如果确有将 ID 归档的需要,可以将 NSManagedObjectID 转换成 URI 表示。
共三种:结果状态( statusOnly )、记录数量( count )、所有记录的 NSManagedObjectID ( objectIDs ) 。 需要注意的是,所有的 NSManagedObjectID 对应的实体( Entity )必须一致,比如本例中均为 Item 。 下面的代码将更新所有 timestamp 晚于三天前的 Item 数据,将其的 timestamp 更新为当前日期: func batchUpdateItem() async throws -> [NSManagedObjectID [NSManagedObjectID] } } 需要注意如下事项: propertiesToUpdate 中,如属性名称拼写错误将导致程序崩溃 propertiesToUpdate 中,如更新值类型错误将导致程序崩溃 [NSManagedObjectID] ?? [] // 创建变动字典。根据数据变化类型,创建不同的键值对。
本文将对这些表和字段进行介绍,或许可以换个角度帮助你解开部分疑惑,例如:Core Data 为什么不需要主键、NSManagedObjectID 是如何构成的 、保存冲突的判断依据是什么。 在将 NSManagedObjectID 转换成可存储的 URL 时,该值表示对应的持久化存储。 NSManagedObjectID 的构成 托管对象的 NSManagedObjectID 由:数据库 ID + 表 ID + 实体表中的主键共同构成。 通过将 NSManagedObjectID 转换成可存储格式的 URL ,可以将它的构成清晰地展示出来。 let url = itemSub.objectID.uriRepresentation() tableAndFieldInCoreData_nsmanagedObjectID_url 【 文件(持久化存储
如果需要在线程之间传递对象,可以使用 NSManagedObjectID 来实现。SwiftData 并发支持SwiftData 利用了 Swift 的现代并发特性。 取而代之的是,可以使用 NSManagedObjectID 来在不同的线程之间传递对象。此外,文章还提到了一些问题,如在后台上下文上执行的更改可能不会立即合并到主视图上下文中。
前一期内容|全部周报列表 原创 NSManagedObjectID 与 PersistentIdentifier:掌握 Core Data 与 SwiftData 中的数据标识符[5] Fatbobman 在这两个框架中,NSManagedObjectID 和 PersistentIdentifier 功能相似,且都极为重要。本文将深入探讨它们的功能、使用方法及注意事项。 itemName=sswg.swift-lang [5] NSManagedObjectID 与 PersistentIdentifier:掌握 Core Data 与 SwiftData 中的数据标识符
另外,SwiftData 的 PersistentIdentifier 符合 Codable 协议,这使我们可以在它与 NSManagedObjectID 之间进行转换。 利用 PersistentIdentifier 的 decode 构造方法,SwiftDataKit 支持将 NSManagedObjectID 转换为 PersistentIdentifier,用下面的代码 由于 NSManagedObjectID 在不同 NSPersistentStoreCoordinator 间无法保持一致,可以使用 SwiftDataKit 提供的如下功能: 将 PersistentIdentifier
另外,SwiftData 的 PersistentIdentifier 符合 Codable 协议,这使我们可以在它与 NSManagedObjectID 之间进行转换。 利用 PersistentIdentifier 的 decode 构造方法,SwiftDataKit 支持将 NSManagedObjectID 转换为 PersistentIdentifier,用下面的代码 由于 NSManagedObjectID 在不同 NSPersistentStoreCoordinator 间无法保持一致,可以使用 SwiftDataKit 提供的如下功能: 将 PersistentIdentifier
OBJC_TAG_NSAtom =0, OBJC_TAG_1 =1, OBJC_TAG_NSString =2, OBJC_TAG_NSNumber =3, OBJC_TAG_NSIndexPath=4, OBJC_TAG_NSManagedObjectID
数据信息转换:持久化历史跟踪事务中包含的数据信息为 NSManagedObjectID,需要使用 SwiftDataKit[6] 将其转换为PersistentIdentifier,以便在SwiftData private func changeHandler(_ change: NSPersistentHistoryChange) { // 通过 SwiftDataKit ,将 NSManagedObjectID
= 2, OBJC_TAG_NSNumber = 3, OBJC_TAG_NSIndexPath = 4, OBJC_TAG_NSManagedObjectID
OBJC_TAG_NSString = 2, OBJC_TAG_NSNumber = 3, OBJC_TAG_NSIndexPath = 4, OBJC_TAG_NSManagedObjectID
是否可以使用 @unchecked Sendable 标注 NSManagedObjectIDQ:在可以确保 NSManagedObjectID 不是临时状态的情况下,是否可以使用 @unchecked 在 Core Data 中,NSManagedObjectID 是线程安全的。通过向其他的上下文传递 ID,并通过该 ID 在不同线程的上下文中获取托管对象,这样可以确保应用不会出现崩溃。
}} •通过userinfo中的kCSSearchableItemActivityIdentifier键获取到uniqueIdentifier(Core Data数据的uri)•将uri转换成NSManagedObjectID
. */ 因为在 fetch 的过程中,通过 relationshipKeyPathsForPrefetching 中指定的关系数据的 NSManagedObjectID 已被一并提取。
localContainer } return cloudContainer } // 某些权限检查工作,仅用于举例 func checkPermission(id:NSManagedObjectID
最好在深拷贝操作前后使用 NSManagedObjectID 进行数据传递。 内存占用 当深拷贝的托管对象牵涉大量的关系数据时,则可能会形成大量的内存占用。
Core Data objects通过内部的NSManagedObjectID属性去唯一标识一个objects,Realm把这个留给开发者去完成。
PersistentIdentifier 可以被视为 NSManagedObjectId 的 SwiftData 实现。
在 Reducer 中获取并管理 WrappedID类似上面的方法,仅在 State 中保存线程安全的 WrappedID( 包装后的 NSManagedObjectID )。