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

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

欢迎大家在 Discord 频道[6] 中进行更多地交流托管对象与可选值Core Data 实体属性的可选性理念早于 Swift 的存在,允许属性暂时无效。...例如,当你创建一个带有字符串属性的新对象时,初始值( 在没有默认值的情况下 )是 nil,这在对象被验证之前( 通常在 save 时 )是没有问题的。...事实上,在 Xcode 自带的 Core Data 模版中,就是这样使用的。image-20221212101526366但这确实是正确的使用方式吗?是否会有严重的安全隐患?...从另一个角度来看,即使在托管上下文中使用 delete 方法删除该实例在数据库中对应的数据,但如果该托管对象实例仍被代码或视图所引用,Swift 并不会销毁该实例,此时,托管对象上下文会将该实例的 managedObjectContext...开发者不能像之前那样假设自己对数据具备完全的掌控能力。在代码或视图中,如果不为随时可能已被删除的数据做好安全准备,问题将十分地严重。

3.3K20

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

当预览正常工作时,它可以极大地提高开发效率;而预览又随时可能因为各种莫名其妙的原因崩溃,不仅影响开发进程,同时又让开发者感到沮丧(很难排查出导致预览崩溃的故障)。...在预览含有Core Data元素的视图时崩溃的出现次数会愈发频繁,在某种程度上可能已经影响了开发者在SwiftUI中使用Core Data的热情。...结合两年来我在SwiftUI中使用Core Data的经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃的部分原因•如何在之后的开发中避免类似的崩溃出现•如何在Xcode中安全可靠地预览含有...预览在Xcode中的工作原理同标准的模拟器十分接近。但为了让它可以即时响应SwiftUI视图的变化,苹果对其做出了不少的修改。...为了便于在预览中重复使用,我们可以在CoreDataStack或其他你认为合适的地方提前创建好用于预览的数据,在预览时直接调用即可。

5.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    2.手动配置环境 iOS允许在创建项目时勾选“Use Core Data”复选框,通过该方式创建的项目已经完成了所有Core Data必须资源的初始化,但此处并不打算使用这种方式来初始化Core Data...、NSManagedObjectContext修改应用程序委托类的接口部分,在接口部分定义上面3个核心API的属性,并增加一个对NSManagedObjectContext对象执行存储的方法、一个获取应用...= nil) { // 如果托管对象上下文中包含了未保存的修改,执行保存,如果保存失败记录错误信息 if ([managedObjectContext hasChanges...最后调用NSManagedObjectContext对象的save:方法执行保存。...NSManagedObjectContext对象的save:方法执行保存。

    1.5K50

    小萝莉说Crash(一):Unrecognized selector sent to instance xxxx

    因此在编译阶段不会进行类和方法的绑定,而是在运行时执行绑定操作。当类的方法没有实现或对象被提前release时,这个问题会在运行时表现出来,从而导致App崩溃。...方法实现事件监听、延时操作或异步操作,但定义后忘记实现方法或方法名书写错误都是常有的事,尤其是在代码量变大,代码结构和注释不够完善的情况下。...return NO; } 错误分析: delegate 是在开发复杂App时必定会用到的机制,通常地,delegate 被定义为id类型,其被设置的实例可能没有实现 RequestDelegate 方法...,没有调用setter方法对属性赋值,因此没有添加引用计数,这样在使用self.delegate时,有可能已经被release了,此时应用就会崩溃。...但万变不离其宗,此类问题的核心就是指向对象的地址出现问题,导致方法调用不成功。

    7.6K40

    iOS Crash不崩溃

    用户在使用App的过程中,经常遇到闪退的情况,体验不太好,本文尝试探索引发闪退的原因,以及在遇到crash的情况下,尽可能的保持程序运行,并及时上报错误。...比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。...dealloc时遍历数组,数组中不应该存在对象,如果存在对象,应该抛出异常并接收,提示用户KVO的释放存在问题。...移除未注册的观察者:在移除A对象的观察者时,先判断数组中是否有A对象的观察者,如果有,再移除。...默认情况下,对象接收到未知的消息,会导致程序崩溃。

    2.2K20

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

    但 Core Data 由于其特有的并发规则,使用不慎容易导致代码陷入不可控状态,因此让不少开发者对在 Core Data 中进行多线程开发产生了望而却步的情绪。...本文将对 Core Data 并发编程中几个常见的问题予以提示,以便开发者更好地了解 Core Data 的并发规则,充分享受 Core Data 提供的强大功能。...,绝大多数的操作都会报错 }} 在非主线程上调用 viewContext 的方法时,程序会立即崩溃。...设置正确的合并策略 当使用了多个上下文或多个持久化存储协调器时,在保存处在不同环境的托管对象时就有可能发生冲突。 本节的合并策略中的合并,并非指上节中的上下文合并。...•在主上下文中修改托管对象 A,尝试保存。•在保存时,A 的乐观锁版本号已经同数据库 B 新的版本号不一致了,发生了保存冲突。此时就需要根据设置的合并策略来解决如何取舍的问题。

    82920

    SwiftUI + Core Data App 的内存占用优化之旅

    在我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用的内存占用为 1.6 GB 左右。...尽管从表面上来看,惰性容器仅会在视图进入可视区域时才会对其进行操作,但一旦该视图被显示过( body 被求过值 ),即使该视图离开可视区域,SwiftUI 仍会保存视图的 body 值。...所谓行缓存,便是指当 Core Data 从 SQLite 中获取数据时,首先将数据以接近原始存储格式的形式保存在行缓存( 内存 )中。...即使我们在 onDisappear 中将该变量设置为 nil,但 SwiftUI 并没有释放之前它所占用的空间。...} 在最终的代码中,我们对图片数据在内存中的三个备份实现了有效的控制。在同一时间( 理想情况下 ),只有出现在可视区域的图片数据才会保存在内存中。

    2.4K40

    SwiftUI + Core Data App 的内存占用优化之旅

    在我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用的内存占用为 1.6 GB 左右。...尽管从表面上来看,惰性容器仅会在视图进入可视区域时才会对其进行操作,但一旦该视图被显示过( body 被求过值 ),即使该视图离开可视区域,SwiftUI 仍会保存视图的 body 值。...所谓行缓存,便是指当 Core Data 从 SQLite 中获取数据时,首先将数据以接近原始存储格式的形式保存在行缓存( 内存 )中。...即使我们在 onDisappear 中将该变量设置为 nil,但 SwiftUI 并没有释放之前它所占用的空间。...} 在最终的代码中,我们对图片数据在内存中的三个备份实现了有效的控制。在同一时间( 理想情况下 ),只有出现在可视区域的图片数据才会保存在内存中。

    1.3K10

    升级IOS8游戏上传自定义头像功能失效的问题

    为了支持arm64,之前已经折腾了很久,昨晚打包准备提交苹果审核时,测试那边的同事反馈说游戏上传自定义头像功能不可用了。...具体实现就是点击游戏内换自定义头像的按钮后,调用不同平台相应的方法,获取用户选择的图片数据,然后将图片裁剪再传给后台保存至特定的目录下。...日志显示其实游戏已经启动了,都开始请求CDN上的资源了,只是界面还停留在重启那个界面,但崩溃的点却挂在了CCDictionary.cpp中。...换成IOS8.1的SDK后,上传头像功能不可用了,搜索了好久发现都跟自己的问题对不上,当输入特定的关键字时出来的第一条就是自己想要的,结果几分钟就把问题解决了,但找相应答案之前却已经花了将近4个小时…...、上传头像等问题就像一座大山挡在了你的面前。

    68820

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

    NSManagedObject操作的上下文,NSManagedObject的操作会先缓存在上下文中,还未存到磁盘中 - (NSManagedObjectContext *)managedObjectContext...交互之家再插了一层子线程的privatecontext,context之间的传递是很快的,这样可以有效地避免IO阻塞主线程,而且childContext调用save方法,其parentContext不用任何...由于大部分的操作都是privateContext在子线程中操作的,所以这种设计是UI线程耗时最少的一种设计,但是它的代价是需要多写mergeChanges的方法。...,整个过程如下: 在子线程新建了一个current_context,并且设置他的父context为主线程的context(default context),然后Person在子线程context改变 将...在子线程将变动保存到磁盘 如果想用第三种方式的话可以这样:在修改之后发出NSManagedObjectContextDidSaveNotification通知主线程的context。

    75320

    iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM。...sectionDictionary;       3.在sectionDictionary中我们存放着两个键值对 header和items, header中存放的时section中的名字,items中存放的时每个...= [delegate managedObjectContext]; ​    c.编辑点击button要回调的方法,在点击添加按钮时首先得通过上下文获取我们的实体对象,获取完实体对象后再给实体对象的属性赋上相应的值...但还是比较中规中矩的,只要按部就班的来,是不难实现的。...3.在之前保存的ViewController中如果Person为空,说明是执行的添加记录的方法我们就生成一个新的person, 如果Person不为空则不新建Person对象,直接更新完保存。

    2.2K80

    SwiftDataKit:让你在 SwiftData 中使用 Core Data 的高级功能

    欢迎大家在 Discord 频道[2] 中进行更多地交流 SwiftData 当前的困境 与 Core Data 相比,SwiftData 在数据模型声明、类型安全、线程安全、以及与 SwiftUI 整合等多个方面进行了全面提升...数据量大时,这种方法对性能和内存占用的影响极大。...实例所绑定的线程与创建时的上下文有关( _inheritActorContext )。...modelContext.fetch(categoryDescription).first } SwiftData 在多线程开发方面与 Core Data 类似,只是形式不同。...总结 通过本文的讨论和示例,我们可以看到,虽然当前 SwiftData 还无法实现 Core Data 的所有高级功能,但通过 SwiftDataKit 提供的接口与工具,开发者可以相对轻松地在 SwiftData

    33820

    SwiftDataKit:让你在 SwiftData 中使用 Core Data 的高级功能

    欢迎大家在 Discord 频道[2] 中进行更多地交流 SwiftData 当前的困境 与 Core Data 相比,SwiftData 在数据模型声明、类型安全、线程安全、以及与 SwiftUI 整合等多个方面进行了全面提升...数据量大时,这种方法对性能和内存占用的影响极大。...实例所绑定的线程与创建时的上下文有关( _inheritActorContext )。...modelContext.fetch(categoryDescription).first } SwiftData 在多线程开发方面与 Core Data 类似,只是形式不同。...总结 通过本文的讨论和示例,我们可以看到,虽然当前 SwiftData 还无法实现 Core Data 的所有高级功能,但通过 SwiftDataKit 提供的接口与工具,开发者可以相对轻松地在 SwiftData

    33940

    如何结合 Core Data 和 SwiftUI

    如果我们对 Core Data 说“这不是必须的”(您可以在模型编辑器中完成),它仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性在保存时具有值——在其他时间它们可以为 nil...我们无法在代码中看到该类,因为它是在构建项目时自动生成的,就像 Core ML 的模型一样。...因此,现在将此属性添加到ContentView: @Environment(\.managedObjectContext) var moc 设置好之后,下一步是添加一个按钮,该按钮生成随机的学生并将其保存在托管对象上下文中...// more code to come } **注意:**不可避免地有人会抱怨我强行对randomElement()调用,但是实际上我们只是手工创建了具有值的数组——它将永远成功。...在此项目的后面以及将来,我们都将更多地关注 Core Data,但到目前为止,您已经走了很远。

    11.8K30

    【IOS】IOS开发问题解决方法索引(五)

    讨论范围:block的使用,内存管理,内部实现。 不包含的内容:gc arc下的block内存,block在c++中的使用。...13.1 Batch Updates 在CoreData中想要更新大量数据,我们往往要将大量修改后的NSManagedObject 加载到 NSManagedObjectContext 中并保存,这会占用大量内存...你可能会采取批处理的方式,即一小批一小批的更新 NSManagedObject 并保存到 NSManagedObjectContext 中,但这样会花费很多时间,用户体验较差。...Batch Updates,一些数据验证工作就落在了程序员的身上(你需要写一段代码验证更新后的数据是合法的,用户可不希望在跑步APP上看到自己今天跑步里程是个负数)。...Batch Updates的优势在于其效率,在处理上万条数据的时候,它执行的时间跟SQL语句执行时间相当。

    89120

    【GAN优化】小批量判别器如何解决模式崩溃问题

    第一季更新了12篇小文,只解读了GAN的冰山一角,第二季将作为第一季的“零零星星”的补充,讲解包括其他的损失函数、训练算法等等方面,并且会扩展到隐空间、离散数据等方向。...模式崩溃的原因 当模式崩溃发生时,生成器 G(z)往往会把很多不同的z均映射成某个x,(更确切地说,指x以及其附近的点,用A表示),接下来更新判别器D(x)后,判别器会很快发现这个病态的mode A从而降低了对这个...其实这并不奇怪,因为在训练生成器时,目标函数为: ? 其过程为:生成器G(z)生成m个样本{x1,x2,...,xi,...,xm},然后将m个x分别独立送给判别器D(x)判定获得梯度信息。...还是在第一节的例子中,使用小批量判别器,当发生模式崩溃的生成器需要更新时,G(z)先生成一个批量的样本{G(z1),G(z2),...G(zm)},由于这些样本都在mode A下,则计算得到的mini-batch...一个简化版本 在Progressive GAN中,给出了一个简化版本的小批量判别器,其思想与上述相同,只是计算方式比较简单,对于判别器的输入样本{x1,x2,...

    1.1K30

    【IOS开发高级系列】CoreData专题

    nib 中可视化地操作数据对象。...NSPersistentDocument 常用方法 -managedObjectContext返回文档的 Managed Object Context,在多文档应用程序中,每个文档都有自己的 Context...我们可以使用谓词来设置查询条件,通常会将常用的 Fetch Requests 保存到 dictionary 以重复利用。...你可能会采取批处理的方式,即一小批一小批的更新NSManagedObject并保存到 NSManagedObjectContext 中,但这样会花费很多时间,用户体验较差。         ...界面,即为XCode工作区右侧工具栏);     3.修改新数据模型mydata2,在新的文件上添加,修改或删除字段及表;     4.在程序启动时添加如下代码: NSDictionary *optionsDictionary

    72550
    领券