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

架构之路 (七) —— iOS App的SOLID原则(一)

{ fatalError("Unresolved error \(error), \(error.userInfo)") } } } 初始值设定项中的参数定义容器是内存中的临时容器还是具有存储在设备上的数据库文件的实际容器...在重构的后期,您将能够完全删除这些预览支持对象,并用更有条理的内容替换它们。 注意:static属性默认是惰性的。在您使用它们之前,它们永远不会被分配到内存中。...然后使用这些日期来过滤 Core Data 数据库中所有存储的费用。 这样,显示的费用会适应您在类的初始值设定项中传递的日期范围的值。...container.viewContext, reportRange: .daily) ExpensesView(dataSource: reportsDataSource) } } 您向数据源的初始值设定项添加了一个...Updating ContentView.swift 此时,您在 ContentView.swift 中只剩下几个错误。 转到该文件并开始修复它们。

4.7K10

ObservableObject研究

,数据流并非完全单向的•在部分视图中可以结合SwiftUI通过的其他包装属性如@FetchRequest等将状态局部化 后两项是利用SwiftUI的特性,也可以不采用,完全采用单向数据流的方式 基于以上方法...Xcode的代码实时解析能力限制 如果你在同一个View中写入了过多的代码,Xcode的代码提示功能几乎就会变得不可用了。...尤其State中本来很多数据的变化性是不高的,大量的View只需要使用变化性低的数据,但只要State发生任何改动,都将被迫重绘。 如何改善 在发现了上述的问题后,开始逐步尝试找寻解决的途径。...•在当前View使用SwiftUI提供的其他包装属性我现在最常使用的SwiftUI的其他包装属性就属@FetchRequest了。...FetchRequest完全可以实现同其他CoreData NSFetchRequest一样的程序化Request设定,结合上面的方式同样可以将Request生成器放在Store中而不影响当前View。

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

    Swift Core Data 分阶段迁移

    前言在这之前,我发布了一篇文章,在其中解释了如何使用映射模型和自定义迁移策略执行复杂的 Core Data 迁移。...虽然这种方法性能良好且运行良好,但很难维护,不适用于应用程序扩展,并且存在高度的错误风险。例如,对于每个需要自定义迁移的新模型,你需要定义一个映射模型,以定义如何将每个模型的现有版本迁移到新版本。...与之前的文章一样,我们想要将 Track 模型中的 json 属性转换为一个单独的实体,该实体将为每个曲目保存所有相关的艺术家信息。...文件名需要与包中的 .mom 文件的名称匹配。我们定义了 didMigrateHandler 闭包,在模型迁移后调用。此时,新的模型版本可在上下文中使用,你可以填充其属性。...最后,文章展示了如何设置使用分阶段迁移的 Core Data 栈。通过使用分阶段迁移,可以显著提高开发者体验,简化迁移流程,并降低错误风险。

    10210

    如何在 Core Data 中使用 Derived 和 Transient 属性

    let count = todolist.count 如何设置 Derived 属性 通常我们需要在 Core Data 的数据模型编辑器(Data Model Editor)中设置派生属性,如下图,我们为上面的例子中的...@count (计算 items 关系对应的数据个数) 开发者可以根据需要设定派生属性的类型和派生表达式,目前支持的派生表达式有以下几种形式: •仅仅复制内容通常使用在 to-one 的关系中,比如上面的例子中...Derived 的注意事项 在配置 Derived 属性时,如果不选择 Optional,直接执行代码的话,在添加数据时会得到类似如下的错误: Fatal error: Unresolved error...尽管在 Data Model Editor 中,我们可以为 Transient 设置默认值,但很多场景下,我们需要根据情况或其他数据计算并创建 Transient 的初始值。...因为使用了@FetchRequest,因此在复制过程中的 1-2 秒钟,UI 列表中会出现两个同样的数据记录,会给使用者带来困惑。

    1K20

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

    结合两年来我在SwiftUI中使用Core Data的经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃的部分原因•如何在之后的开发中避免类似的崩溃出现•如何在Xcode中安全可靠地预览含有...其他视图、方法、声明等的代码错误,都可能会导致你无法预览当前的视图。 在排查视图预览崩溃的原因时,一定不能只关注当前视图或临近视图的代码,其他代码中的错误可能才是罪魁祸首。...•在模拟器设备管理器中删除模拟器再重新添加 上述的手段,多数也都适用于修复某些情况下的预览崩溃。...此种情况下,通常我们会在模拟器中删除App,重新安装运行即可解决问题。由于预览也是模拟器,在它的沙盒中同样可能出现类似的问题。可以使用上文中关于预览模拟器的修复方法来尝试解决。...批量创建的数据有利于用于使用了@FetchRequest的视图在预览中调用。

    5.2K10

    如何结合 Core Data 和 SwiftUI

    因此,剩下的就是我们要决定要在 Core Data 中存储哪些数据,以及如何读出这些数据。...这次将其称为@FetchRequest,它带有两个参数:我们要查询的实体以及我们希望结果如何排序。...如果我们对 Core Data 说“这不是必须的”(您可以在模型编辑器中完成),它仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性在保存时具有值——在其他时间它们可以为 nil...更好的是,它已经将其添加到 SwiftUI 环境中,这就是@FetchRequest属性包装器起作用的原因——它使用了环境中可用的任何托管对象上下文。...self.moc.save() 最后,您现在应该可以运行该应用程序并对其进行尝试——单击几次 “Add” 按钮以生成一些随机的学生,您应该看到他们滑入我们列表的某个位置。

    11.8K30

    Swift 单元测试入门

    例如,在测试 JSON 响应的解码时: func testDecoding() throws { /// 当数据初始值设定项抛出错误时,测试将失败。...它会阻止您编写 XCTAssertNotNil 并结合解包或处理其余测试代码的条件链接。我鼓励您阅读我的文章 《如何使用 XCTest 在 Swift 中测试可选值》以了解更多详细信息。...在 Xcode 中运行单元测试 编写测试后,就该运行它们了。通过以下提示,这将变得更有效率。 使用测试三角形 您可以使用前导三角形运行单个测试或一组测试: 前导三角形可用于运行单个或一组测试。...在修复错误之前编写测试 跳到一个错误上并尽快修复它是很诱人的。虽然这很好,但如果您可以防止将来再次出现相同的错误,那就更好了。...通过在修复 bug 之前编写单元测试,可以确保相同的 bug 不会再次发生。将其视为“测试驱动的错误修复”,从现在开始也称为 TDBF 。

    2.7K40

    SwiftUI 与 Core Data —— 数据获取

    尽管在实践中,如果能在确保不访问托管对象的非线程安全属性的前提下,在非创建托管对象的线程中持有托管对象并不会出现崩溃的情况,但出于谨慎的考虑,我最终还是放弃了这种方式。...)中的属性是否符合 DynamicProperty ,都将被重建。...image-20221203183414864当应用运行于托管环境时,仅需提供正确的视图上下文,并将 dataSource 中的属性值修改成 fetchRequest 即可。...self 的问题在订阅闭包中使用底层数据,如此就可以绕过无法在结构体中引入 self 的问题。...在下一篇文章中,我们将探讨如何在 SwiftUI 中安全地响应数据,如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。希望本文能够对你有所帮助。

    4.7K30

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

    本文将讨论,在不使用 Core Data 数据栈的情况下,开发者如何在 SwiftData 中调用 Core Data 提供的高级功能,以扩展 SwiftData 目前的能力。...如此一来,SwiftData 在数据模型声明上的优势便当然无存,不仅增加了工作量,开发者还需要面对如何处理两个数据框架、模型版本之间的协作问题。...SwiftDataKit 是一个实验性质的库。由于 SwiftData API 仍在快速演化中,我建议只有了解其实现原理且明确风险的有经验开发者,在特定场景下谨慎使用。...0 } return result } 在 10000 条数据的测试中,基于 SwiftDataKit 的实现方法,效率是原生方法的 4 至 5 倍,内存占用也少了许多。...默认情况下,SwiftData 中的模型类型名对应 Entity 名,变量名对应属性名。

    33820

    优化在 SwiftUI List 中显示大数据集的响应效率

    在 SwiftUI 视图的生命周期研究[3] 一文中,我对 List 如何对子视图的显示进行优化做了一定的介绍。...这与之前仅会实例化 10 - 20 个子视图的预测真是大相径庭。是什么影响了 List 对视图的优化逻辑?...在 SwiftUI 中为视图设置显式标识目前有两种方式: 在 ForEach 的构造方法中指定 由于 ForEach 中的视图数量是动态的且是在运行时生成的,因此需要在 ForEach 的构造方法中指定可用来标识子视图的...新的问题 细心的朋友应该可以注意到,运行解决方案一的代码后,在第一次点击 bottom 按钮时,大概率会出现延迟情况(并不会立即开始滚动)。...生产中的处理方式 本文为了演示 id 修饰符在 ForEach 中的异常状况以及问题排查思路,创建了一个在生产环境中几乎不可能使用的范例。

    9.3K20

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

    本文将讨论,在不使用 Core Data 数据栈的情况下,开发者如何在 SwiftData 中调用 Core Data 提供的高级功能,以扩展 SwiftData 目前的能力。...如此一来,SwiftData 在数据模型声明上的优势便当然无存,不仅增加了工作量,开发者还需要面对如何处理两个数据框架、模型版本之间的协作问题。...SwiftDataKit 是一个实验性质的库。由于 SwiftData API 仍在快速演化中,我建议只有了解其实现原理且明确风险的有经验开发者,在特定场景下谨慎使用。...0 } return result } 在 10000 条数据的测试中,基于 SwiftDataKit 的实现方法,效率是原生方法的 4 至 5 倍,内存占用也少了许多。...默认情况下,SwiftData 中的模型类型名对应 Entity 名,变量名对应属性名。

    33940

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

    主程序与扩展程序数据同步Q:我有一个主应用程序和一个扩展程序,它们都读取相同的 Core Data 数据库。但是,当我在主应用程序中进行更改时,我的扩展程序在重新启动之前不会看到更改。...@FetchRequest 的性能如何Q:@FetchRequest 在性能方面是否优于在 ViewModel 的构造方法中通过 fetchRequest 获取数据的方式?...例如,当你创建一个带有字符串属性的新对象时,初始值( 在没有默认值的情况下 )是 nil,这在对象被验证之前( 通常在 save 时 )是没有问题的。...即使你在模型编辑器中将属性( 例如字符串 )标记为非可选( 设定了默认值 ),但在从托管对象获取属性值的时候,返回值仍会是 Optional 类型。...在持久化历史中如何体现有序对象的变化状态Q:持久化历史中是如何体现 “有序” 关系中的对象的顺序发生了改变?NSPersistentHistoryChange 是否包含父实体或子实体?

    3.3K20

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

    本文将介绍可能在视图中产生严重错误的原因,如何避免,以及在保证视图对数据变化实时响应的前提下如何为使用者提供更好、更准确的信息。由于本文会涉及大量前文中介绍的技巧和方法,因此最好一并阅读。...例如,当你创建一个带有字符串属性的新对象时,初始值( 在没有默认值的情况下 )是 nil,这在对象被验证之前( 通常在 save 时 )是没有问题的。...例如下面的 count 属性( Integer 16 )在模型编辑器中被设定为可选,但在生成的代码中仍将为非可选值类型( Int16 )。...假设我们不限定转换过程运行的线程,备选值的方式对于由视图上下文创建的托管对象实例仍将有效( 但有可能会出现其它的线程错误 )。...但在类 Redux 框架中,为了线程安全( Reducer 未必运行于主线程,详细请参阅之前的文章 )我们不会将托管对象实例直接发送给 Reducer,而是传递转换后的值类型。

    3.3K20

    错误处理

    错误可以从表达式中引发,也可以从表达式中处理。 引发错误 引发错误的语法如下: 错误引发表达式: error 表达式 文本值可用作错误值的简写。...= e ] 的评价时以下成立错误处理表达与otherwiseclause: 必须在其他子句之前评估受保护的表达式。..."B" // error with message "B" 记录错误和 let 初始值设定项 以下示例显示了一个记录初始值设定项,其字段A引发错误并由其他两个字段B和访问C。...但是,该错误是由字段初始值设定项引发的,该初始值设定项仅在需要时运行,因此在从 f 返回记录并通过try表达式之后。...未实现错误 在开发表达式时,作者可能希望省略表达式某些部分的实现,但仍希望能够执行表达式。处理这种情况的一种方法是为未实现的部分引发错误。

    65520

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

    在 Core Data 中查询和使用 count 的若干方法 请访问我的博客 www.fatbobman.com[1] ,以获取更好的阅读体验。...在对 count 读取需求频繁的情况下,是极为优秀的解决方案 derived 完整的派生属性使用方法,请参阅 如何在 Core Data 中使用 Derived 和 Transient 属性[3]。...九、查询某对多关系所有记录的 count 数据 当我们想统计全部记录(符合设定谓词)的某个对多关系的合计值时,在没有使用派生属性或 willSave 的情况下,可以使用下面的代码: let fetchquest...很多的设定都是通过 NSExpression 完成的•此方法中 NSExpression 使用的是 count 方法•返回的结果是一个字典数组。...直接在 SQLite 中处理,效率将高于在代码中对方法十一的结果集数组进行操作。 总结 本文介绍的方法,无所谓孰优孰劣,每种方法都有其适合的场景。

    4.7K20

    Safari技术预览版40更新说明

    ) 对齐FetchResponse和FetchRequest` 的身体处理 (r221772) 修复了Response.statusText 意外地使用HTTP / 2响应的完整HTTP状态行 (r221804...) 修复了Request 可读流体在保持活动时抛出异常 (r221342) Accessibility title属性工具提示和aria-label属性标签区分开来 (r221918) Web API...(r221462) CSS 删除对于 >> 后代选择器语法的支持 (r221788) 修复了伪元素在display:none 子树时getComputedStyle 获取结果错误的问题 (r221542...(r221910) Web Inspector 修复了在窄宽度导致工具栏按钮隐藏的问题 (r221338) 在“设置”选项卡中防止拆分控制台 (r221882) 在仪表板和时间轴选项卡中使用相同的时间轴图标...用于未显示的帧,或暂停时进入的帧 (r221937) 修复了MSE-to-Canvas的绘画,会在繁重的工作负载中“卡住”的问题(r221430) Rendering 增加了HTMLImageElement.async

    62930

    Swift 中的属性包装器

    = wrappedValue.capitalized } } 请注意,我们需要显式地将传递到初始值中的任何字符串大写,因为属性观察器只有在值或对象完全初始化之后才会触发。...init(wrappedValue:)初始值设定项(就像我们的Capitalized那样),那么我们甚至可以在本地为包装的属性分配默认值,如下所示: struct Document { @Capitalized...属性的属性 属性包装器也可以有自己的属性,并且支持进一步的定制,甚至可以将依赖项注入到包装器类型中。...——我们可以给它们属性、初始值设定项甚至扩展——这反过来又使我们能够使我们的调用站点真正整洁干净,并充分利用Swift强大的类型系统。...即使在诸如SwiftUI这样的声明性框架之外,属性包装器也有大量潜在的用例,其中许多不需要我们对整体代码进行任何大的更改——因为属性包装器大部分都是完全透明地运行。

    2.7K30

    C#3.0新增功能06 对象和集合初始值设定项

    使用 C# 可以在单条语句中实例化对象或集合并执行成员分配。 对象初始值设定项 使用对象初始值设定项,你可以在创建对象时向对象的任何可访问字段或属性分配值,而无需调用后跟赋值语句行的构造函数。...利用对象初始值设定项语法,你可为构造函数指定参数或忽略参数(以及括号语法)。 以下示例演示如何使用具有命名类型 Cat 的对象初始值设定项以及如何调用无参数构造函数。...请注意,自动实现的属性在 Cat 类中的用法。...尽管对象初始值设定项可用于任何上下文中,但它们在 LINQ 查询表达式中特别有用。...请注意,各个对象初始值设定项分别括在大括号中且用逗号隔开。

    89410

    iOS开发之使用XMPPFramework实现即时通信(二)

    获取好友列表也是通过XMPPFramework中的Roster来获取的,运行截图如下: ?...的代码实现 在获取用户列表的代码中就会用到我们之前注册的Roster的内容,因为我们在实例化Roster的时候指定的保存策略是用CoreData进行保存的,并且是自动获取好友列表。...所以在获取好友列表的TableViewController中我们只需要通过CoreData来获取好友列表即可。...error localizedDescription]); 8 } 至于如何在TableView上显示FetchedResultController获取的数据,请参考之前的博客:iOS开发之表视图爱上...,其实XMPPFramework中的组件使用方法都差不多,首先第初始化内存,然后进行相关配置,在后就是在XMPPStream中激活,最后就是如何使用了。

    1.3K60
    领券