首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI 与 Core Data —— 安全地响应数据

删除与响应式编程托管对象实例创建于托管上下文中,且仅能安全运行于其绑定托管上下文所在线程之中。每个托管对象都对应着持久化存储中一条数据( 不考虑关系情况下 )。...从另一个角度来看,即使在托管上下文中使用 delete 方法删除该实例在数据库中对应数据,但如果该托管对象实例仍被代码或视图所引用,Swift 并不会销毁该实例,此时,托管对象上下文会将该实例 managedObjectContext...将转换过程运行于托管对象上下文所在线程中,由于无法获取上下文信息,转换将失败。...我们为视图传递都是托管对象实例本身( AnyConvertibleValueObservableObject 也是对托管对象实例二度包装 )。...任何可能脱离视图传递过程都应使用托管对象实例对应值类型版本。在更改数据时进行二次确认为了避免对主线程造成过多影响,我们通常会在私有上下文中进行会对数据产生变化操作。

3.2K20

Ask Apple 2022 中与 Core Data 有关问答

欢迎大家在 Discord 频道[2] 中进行更多地交流Q&A是否可以在 Core Data 中存储照片Q:你好,我看到一些网站建议 Core Data 不应该用于保存照片,也许他们没注意到可以使用 "...A:在每个版本中添加一个新托管对象模型会更安全,但是如果您从一个版本到另一个版本更改经过充分测试以表明适用于轻量级迁移推断,那么单个托管对象模型就足够了。...A:只有对托管对象模型进行更改时才需要 initializeCloudKitSchema。...A:定义逆向关系使得管理你图表更容易( 比如,设置一个“父级”会自动为对象添加为一个“级” ),并且还允许你委托给 Core Data 进行图表清理( 比如,你想删除一个 “发票” 同时也删除其所有...在 Core Data 中,NSManagedObjectID 是线程安全。通过向其他上下文传递 ID,并通过该 ID 在不同线程上下文中获取托管对象,这样可以确保应用不会出现崩溃。

2.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

Ask Apple 2022 中与 Core Data 有关问答 (下)

在应用程序中一次性加载 CoreData 数据并将其保存在局部变量中使用多个 FetchRequests我目前在 SwiftUI 中使用 UICalendarView 并从 CoreData 中获取数据...私有上下文Q:如何配置 Core Data Stack,以便在后台保存更改时,用户可以继续使用应用程序。...无论是通过 newBackgroundContext 显式地创建一个私有上下文,还是通过 performBackgroundTask 在一个临时私有上下文中进行操作,都不能在私有上下文中使用从 viewContext...托管对象是线程绑定。即使都来自于私有上下文但分属于不同上下文,它也只能在其对应上下文中使用。...异步保存Q:嗨,将照片数据保存到 Core Data 时使用异步是否有必要?谢谢!A:你是在问是否应该使用 perform 或 performAndWait?

3.2K20

如何在 Core Data 中进行批量操作

无论是官方给出数据,还是开发者实际测试,Core Data 批量操作相较于实现相同结果传统方式( 在托管对象上下文中使用托管对象 )来说都具有相当明显优势 —— 执行速度快、内存占用小。...默认值为 true,因此此时这些对象是惰值( Fault )形态 持久化存储协调器将步骤 5 中实例化数据以托管对象数组形式返回给发起请求托管对象上下文 如果上下文中有部分新数据或数据改动与本次获取条件一致...,上下文将一并考虑进来与步骤 6 数据合并 items 变量获得最终满足条件全部数据( 此时数据为惰值形态 ) 使用 item.timestamp 更新数据时,Core Data 会检查当前托管对象是否为惰值...实例 didSave() 方法 抹除更新后 item 和 托管对象上下脏状态 托管对象上下文发送 NSManagedObjectContextDidSaveNotification 通知。...批量操作中高级技巧 除了上文中介绍能力外,批量操作中还有一些其他有用技巧。

1.8K30

详解持久化Core Data框架原理以及使用---转自Bison技术博客

Care Data核心对象托管对象上下文NSManagedObjectContext,所有实体都处于托管对象上下文管理中,Care Data应用对实体所做任何增、删、查、改操作都必须通过托管对象上下文来完成...return YES; } - (void)applicationWillTerminate:(UIApplication *)application { // 当应用被中断时候,将所有托管上下文中数据保存起来...= nil) { // 如果托管对象上下文中包含了未保存修改,执行保存,如果保存失败记录错误信息 if ([managedObjectContext hasChanges...如下代码片段: // 控制Core Data在托管对象上下文中创建一个新实体 Bison* bison = [NSEntityDescription...如下代码: // 获取将要删除实体 Bison* deleteEvent = .....; // 从托管对象上下文中删除指定对象 [self.appDelegate.managedObjectContext

1.4K50

掌握 Core Data Stack

托管对象上下主要职责是管理 NSManagedObject(托管对象)实例集合,对托管对象获取、创建、删除、修改等操作绝大多数都是在此进行。...托管对象上下文内置撤销管理器,提供了 Undo/Redo 功能。...托管对象上下文将确保一个上下文中不会出现多个托管对象实例对应同一个持久存储记录情况,并提供了其它诸如缓存、更改跟踪、惰性加载、数据验证、变更通知等功能。...实际使用中创建多个托管对象上下情况并不少见。...作为协调器,它为其它组件之间创建了沟通桥梁。无论是托管对象模型、托管对象上下文、或者持久化存储都以持久化存储协调器为核心进行协作。

82430

Core Data 是如何在 SQLite 中保存数据

Core Data 实现从 URL 转换为对应托管对象。...保存冲突判断 Core Data 在保存数据时,通过乐观锁方式来判断是否会出现保存冲突情况。而乐观锁判断依据则是根据每条记录 Z_OPT 数据,采用了版本号机制。...,事务产生者需要为托管对象上下文设置事务作者,Core Data 将所有的事务作者信息都汇总在 Z_ATRANSACTIONSTRING 表中。...ZQUERYGEN 字段 如果为托管对象上下文设置了锁定查询令牌( NSQueryGenerationToken[9] ),那么事务记录中还会将当时查询令牌保存在 ZQUERYGEN 字段中 ( BLOB...、对应实例数据位置等信息,按图索骥从数据库中提取实体数据( Z_PK + Z_ENT )并将其合并( 转换成 NSManagedObjectID )到指定上下文中

1.5K20

Swift实践:使用CoreData存储多种数据类通讯录1. CoreData支持存储数据类型2. 使用CoreData存储多种数据类通讯录3. Codable

辣么多人可以一起学习,还挺有意思。 所以基本上下班后时间都奉献给了这个自习室,每周4~5个Demo把大家伙时间塞得满满当当。...说到底,这是一个非标准类型。在中文中,非典型技术宅胖其实觉得翻译成“其他”类型更贴切。哈哈~~就和有关部门一样d=====( ̄▽ ̄*)b厉害。...image.png 2.1 CoreData基本读取操作 2. 1.1 获取CoreData已经保存数据五个步骤 获取总代理和托管对象总管 从Entity获取一个fetchRequest 根据fetchRequest...保存过程中可能会出错,要做一下处理。 添加到数组中 2.1.2 基本存储 获取总代理和托管对象总管 建立一个Entity 保存内容 保存Entity到托管对象。...在OC时代,当需要将一个对象持久化时,需要把这个对象序列化,往常做法是实现 NSCoding 协议。

2K30

储存篇 - CoreData使用大全

【一】前言 Core Data框架提供了对象-关系映射(ORM)功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中数据还原成OC对象。...; } // 如果是想做更新操作:只要在更改了实体对象属性后调用[context save:&error],就能将更改数据同步到数据库 } 3、删:删除数据 /** 删除数据...对象,再通过save:方法进行数据保存。...,作用是设置保存数据类型(NSSQLiteStoreType)、保存路径、是否支持版本迁移等) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT...person = [Man MR_createEntityInContext:localContext]; person.name = @"MagicalRecord存储"; // 保存修改到当前上下文中

2.5K20

Swift实践:使用CoreData完成一个通讯录存储

Core Data架构 一个基本 Core Data 栈由四个主要部分组成:托管对象 (NSManagedObject),托管对象上下文 (NSManagedObjectContext),持久化存储协调器...image.png NSManagedObject是我们数据模型,也就是我们存储对象。这些对象保存在NSManagedObjectContext中,每个存储对象都知道自己对应哪个上下文。...CoreData基本读取操作 2. 1 获取CoreData已经保存数据五个步骤 获取总代理和托管对象总管 从Entity获取一个fetchRequest 根据fetchRequest,从managedContext...保存过程中可能会出错,要做一下处理。 添加到数组中 2.2 基本存储 获取总代理和托管对象总管 建立一个Entity 保存内容 保存Entity到托管对象。...: "name") // 步骤四:保存entity到托管对象中。

1.7K40

关于 Core Data 并发编程几点提示

因此,在 Core Data 中进行并发编程时,请确保遵守以下规则: •托管对象上下文在初始化时被绑定到了与之相关线程(队列)。•从托管对象上下文中检索托管对象被绑定到了所属上下文所在队列。...image-20211104211037413 在不同上下文之间合并更改 使用上面的 delItem 代码,在后台上下文中删除托管对象后,主线程上下文中托管对象仍然存在。...是指将托管对象进行持久化时,为解决因托管对象乐观锁版本不一致产生保存冲突而进行合并策略设置。 尽管并发不是保存冲突必要条件,但在并发环境下非常容易发生保存冲突。...举个例子,方便大家对保存冲突有直观了解: •主上下文中使用 fetch 从数据库中获取了托管对象 A(对应数据库中数据 B)•使用 NSBatchUpdaterequest (不经过上下文)修改了数据库中数据...•在主上下文中修改托管对象 A,尝试保存。•在保存时,A 乐观锁版本号已经同数据库 B 新版本号不一致了,发生了保存冲突。此时就需要根据设置合并策略来解决如何取舍问题。

78220

Core Data with CloudKit (一) —— 基础

在此仅对本文涉及一些基础对象类型做简单介绍和比较: •NSPersistentContainer vs CKContainerNSPersistentContainer通过处理托管对象模型(NSManagedObjectModel...),对持久性协调器(NSPersistentStoreCoordinator)和托管对象上下文(NSManagedObjectContext)进行统一创建和管理。...托管对象托管对象上下文(NSManagedObjectContext)中注册。在任何给定上下文中托管对象最多有一个实例对应于持久存储中给定记录。...检查该操作是否导致私有数据库com.apple.coredata.cloudkit.zone中数据发生变化3.对所有创建CKDatabaseSubscription订阅设备(同一iCloud账户)...,为其返回自上次刷新后数据库发生变化4.将远端数据转换成本地数据(删除、更新、添加等)5.由于视图上下automaticallyMergesChangesFromParen属性设置为真,本地数据变化将自动在视图上下文中体现出来

96130

Swift实践:使用CoreData完成上班签到小工具1. CoreData Stack作用2.创建 CoreData Stack3. 一对多关系4. 完成Demo,了解使用CoreData St

CoreData Stack作用 其实这个东西在一篇时候提到过,不信您看:Swift实践:使用CoreData完成一个通讯录存储 一个基本 Core Data 栈由四个主要部分组成:托管对象 (NSManagedObject...),托管对象上下文 (NSManagedObjectContext),持久化存储协调器 (NSPersistentStoreCoordinator),以及持久化存储 (NSPersistentStore...CoreDataStack,是自定义一个CoreData 对象,可以通过它,初始化项目的CoreData,以及获取到Context,对数据库进行增删改查等操作。...2.创建 CoreData Stack 非典型技术宅既然说了这货有四部分组成,那咱们就一个一个来呗。艾玛,因为发现文章会被抄袭,抄袭之后有些人还不署名,搞只好在文章里面内嵌入一些自己名字。...心酸~~~~ 2.1 iOS9 在iOS9中,CoreData Stack三个核心类是这样: -管理对象上下文NSManagedObjectContext 对象模型NSManagedObjectModel

1.5K30

如何在Xcode下预览含有Core Data元素SwiftUI视图

中,是否为预览视图提供了正确上下文注入,例如: struct ContentView_Previews: PreviewProvider { static var previews: some...由于前文中提到SwiftUI App life cycle独特性,你无法在根视图中使用单例来注入持久化上下文。...SwiftUI通常采用Redux开发模式,通过将获取到Core Data数据转换成标准Swift结构从而避免在视图中使用托管对象上下文或托管对象。...直接使用托管对象 当然,我们仍然可以直接给视图传递托管对象。为了便于在预览中重复使用,我们可以在CoreDataStack或其他你认为合适地方提前创建好用于预览数据,在预览时直接调用即可。...在完成了各种处理CoreData数据方法后,通常会创建一些非常简陋视图或Unit Test来验证代码以及创建测试数据集。这样在进行UI开发时候,我已经可以有一个可用来演示数据库文件了。

5.1K10

在 Core Data 中查询和使用 count 若干方法

具体设置方法,请参阅 Core Data with CloudKit(四)—— 调试、测试、迁移及其他[2] 二、使用托管对象上下 count 方法查询 count 数据 方法一便捷版本。...调用托管对象上下文提供 count 方法,返回值类型为 Int。...八、使用 willSave 记录 count 数据 派生属性使用起来非常方便,但预置方法有限。重写托管对象 willSave 方法,可以获得更多控制力。...复杂逻辑将对数据更改效率产生一定影响。 为已经上线使用 CoreData 数据库添加派生属性或 willSave 方法时,需通过 mapping 或迁移代码处理原有数据新增属性。...当业务逻辑中有类似的需求时,可以考虑为托管对象预设适合分组属性。属性内容也可以通过派生或 willSave 来处理。

4.6K20

iOS中CoreData数据管理系列二——CoreData框架中三个重要

iOS中CoreData数据管理系列二——CoreData框架中三个重要类 一、引言     在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型相关步骤。...CoreData框架中通过相关类将数据——数据模型——开发者无缝衔接起来。...    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl]; 其中还有一些属性和方法进行数据模型管理...三、持久化存储协调者类NSPersistentStoreCoordinator     NSPersistentStoreCoordinator建立数据模型与本地文件或数据库之间联系,通过它将本地数据读入内存或者将修改过临时数据进行持久化保存...@property (nullable, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; //是否有未提交更改 @

64620

CoreData简介以及第三方框架MagicRecord源码解析

一、CoreData结构 可以用两张图来表示: NSManagedObject 数据库对象,一个NSManagedObject对应一张表,NSManagedObject一个属性对应数据表一个字段...NSManagedObject操作上下文,NSManagedObject操作会先缓存在上下文中,还未存到磁盘中 - (NSManagedObjectContext *)managedObjectContext...) 通过 setParentContext 方法,可以设置另外一个 NSManagedObjectContext 为自己父级,这个时候级可以访问父级下所有的对象,而且级 NSManagedObjectContext...setParentContext:rootContext]; } } MagicRecord生成了两个context: rootContext:NSPrivateQueueConcurrencyType,用以保存数据上下文...在线程将变动保存到磁盘 如果想用第三种方式的话可以这样:在修改之后发出NSManagedObjectContextDidSaveNotification通知主线程context。

62920

实时切换 Core Data 云同步状态

,也可以通过创建新 NSPersistentCloudKitContainer 实例来实现,但在单 container 情况下,为了保证托管对象上下文中数据完整性,需要照顾太多可能性,难度较高...由于该过程是在由 NSPersistentContainer 上创建私有上下文中进行,因此只需要将 viewContext.automaticallyMergesChangesFromParent...设置为 true ,即可实现数据在视图上下文中自动合并,而无需对 Persistent History Tracking 创建 Transaction 做处理。...我们需要在 NSPersistentContainer 实例中对该通知进行响应,并将同步数据合并到当前视图上下文中。...删除操作是以上文中提到网络同步模块中保存数据同步日志为依据进行

1.4K20

如何结合 Core Data 和 SwiftUI

我们所有的托管对象都位于托管对象上下文中,该上下文负责实际获取托管对象以及保存更改等。如果需要的话,您可以有许多托管对象上下文,但这距离现在还有一段路要走——实际上,您可以长期使用它。...因此,现在将此属性添加到ContentView: @Environment(\.managedObjectContext) var moc 设置好之后,下一步是添加一个按钮,该按钮生成随机学生并将其保存托管对象上下文中...现在,有趣部分是:我们将使用为我们生成 Core Data 类创建一个 Student对象。这需要附加到托管对象上下文中,以便对象知道应将其存储在何处。然后,我们可以像通常为结构体那样分配值。...chosenFirstName) \(chosenLastName)" 最后,我们需要询问托管对象上下文以保存自身。...现在,您可能认为这需要大量学习,但并不会带来很多结果,但是您现在知道什么是实体和属性,知道什么是托管对象和请求,并且已经了解了如何保存更改

11.8K30
领券