当前位置: 首页 > wzjs >正文

东莞公司网站设计网站优化外包价格

东莞公司网站设计,网站优化外包价格,协同办公系统,网页设计中用div做网站例子概览 在 CoreData 支持的 App 中,一种常见操作就是计算数据库表中指定字段的最大值(或最小值)。就是这样一种看起来“不足挂齿”的任务,可能稍不留神就会“马失前蹄”。 在实际的代码中,我们怎样才能既迅速又简洁的…

在这里插入图片描述

概览

在 CoreData 支持的 App 中,一种常见操作就是计算数据库表中指定字段的最大值(或最小值)。就是这样一种看起来“不足挂齿”的任务,可能稍不留神就会“马失前蹄”。
在这里插入图片描述

在实际的代码中,我们怎样才能既迅速又简洁的找出字段的最大值呢?

在本篇博文中,您将学到如下内容:

  • 概览
  • 0. CoreData 表结构
  • 1. 借助现成的关系属性(Relation Property)
  • 2. 使用“远古” NSArray 的力量
  • 3. 使用 CoreData Fetch 请求
  • 总结

相信学完本课后,大家 CoreData 的算法武器库中又会多几种“削铁如泥”的利刃啦。

本文中所有代码的测试环境为:

  • MBA 2022,M2,内存 16 GB
  • macOS 15.3.2(Sequoia)

那还等什么呢?Let‘s find out!!!😉


0. CoreData 表结构

我们即将展示的所有算法都将在如下 CoreData 表结构中“施展拳脚”:

  • Project 表包含多个 VictoryStage 对象,这通过 Project 的 records 关系体现出来;
  • VictoryStage 表中包含一个类型为 Date? 的 end 字段,它用来表示 VictoryStage 的结束日期;

数据库中被测试的特定 Project 对象里大约包含不到 400 个 VictoryStage 对象,我们要计算的就是:这些对象中 end 字段最大的值

为了方便,我们首先创建一个将集合(Set)类型 records 转换为数组(Array)的辅助方法:

extension Project {var vstages: [VictoryStage] {if let recordAry = records?.allObjects as? [VictoryStage] {return recordAry}return []}
}

接下来,小伙伴们就可以“驰马试剑”,恣意测试我们的算法啦!

1. 借助现成的关系属性(Relation Property)

既然 Project 包含一对多的 vstages 关系,我们最简单的方法是直接从此入手,找到 end 值最大(时间上最新)的那一个 VictoryStage 对象。


因为最新的 Swift Testing 框架还缺少内置的测速机制,我们只能暂时退回到 XCTest 的 measure 方法中去。这里需要提出批评,希望苹果赶快在 Swift Testing 2 中将其补上哦。

关于更多驯服 Swift Testing 测试的小妙招,请小伙伴们移步如下链接观赏精彩的内容:

  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(一)
  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(二)
  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)
  • WWDC24(Xcode 16)中全新的 Swift Testing 使用进阶
  • Xcode 16 中 Swift Testing 的参数化(Parameterized)机制趣谈

算法的实现很简单:我们只需将 vstages 数组按照 end 从新到旧排序,结果数组中第一个 VictoryStage 对象就是我们想要的。

func testPerformanceWithRelationProperty() throws {// 利用 Project 关系属性来计算最新的 VictoryStagemeasure {let vstages = project.vstageslet mostRecent = vstages.sorted(using: SortDescriptor(\VictoryStage.end, order: .reverse)).firstprint("最新的 VStage: \(mostRecent?.end ?? Date.distantPast)")}
}

从单元测试的结果来看,10 次运行的平均耗时为:0.00464 秒。

在这里插入图片描述

2. 使用“远古” NSArray 的力量

我们知道,Swift 中的数组(Array)都是由底层的 Objc 数据结构 NSArray 在默默“撑腰”的。而 NSArray 又自带了一个 sortedArray 排序方法:

在这里插入图片描述
So,我们可以很快据此写出 NSArray 的排序算法:

func testPerformanceWithRelationPropertyNSArray() throws {// 利用 Project 关系属性的 NSArray 来计算最新的 VictoryStagemeasure {let vstages = project.vstageslet mostRecent = ((vstages as NSArray).sortedArray(using: [.init(keyPath: \VictoryStage.end, ascending: false)]) as! [VictoryStage]).firstprint("最新的 VStage: \(mostRecent?.end ?? Date.distantPast)")}
}

美中不足的是,这种方法需要做 2 次类型转换。

小伙伴们可能觉得 NSArray 排序算法和前一种速度差不了多少,不过实际结果可能会让你们大吃一惊:

在这里插入图片描述

是的,你们没有看错!NSArray 排序比 Array 排序快了一个数量级,只需 0.000559 秒。

3. 使用 CoreData Fetch 请求

为了能够充分发挥 CoreData 底层里 Sqlite 原生查询的“奥义”,我们可以直接利用 Fetch 请求来排忧解难:

func testPerformanceWithFetchPredicate() throws {// 利用 CoreData Fetch 请求来计算最新的 VictoryStagemeasure {let req = VictoryStage.fetchRequest()req.predicate = .init(format: "project = %@", project)req.sortDescriptors = [.init(keyPath: \VictoryStage.end, ascending: false)]req.fetchLimit = 1let mostRecent = try! context.fetch(req).firstprint("最新的 VStage: \(mostRecent?.end ?? Date.distantPast)")}
}

在上面的代码中,我们做了这样几件事:

  1. 创建一个 Fetch Request;
  2. 稳妥的设置了它的 Predicate 和排序属性;
  3. 将其搜索结果的数量限制为 1 ;

运行看一下效果!恭喜大家,我们又成功的将性能提升了几倍,现在只需 0.000196 秒了。

在这里插入图片描述

在下一篇文章中,我们将再接再厉,使用 NSExpression 表达式方法来为本系列博文画上一个完美的句号。


想要进一步系统地学习 Swift 开发的小伙伴们,可以来我的《Swift 语言开发精讲》专栏逛一逛哦:

在这里插入图片描述

  • 《Swift 语言开发精讲》

总结

在本篇博文中,我们讨论了 CoreData 中计算字段最大值的三种方法,任君选用。

感谢观赏,我们下一篇再见!😎

http://www.dtcms.com/wzjs/41096.html

相关文章:

  • 西安市规划建设局网站网站快照优化公司
  • 旅游房地产网站建设查询网站
  • WordPress高级投稿网站如何优化一个关键词
  • 网易企业邮箱登录入口官网手机版纯手工seo公司
  • 沈阳市网站设计公司大全google搜索引擎下载
  • ps 怎么做网站网站top排行榜
  • 免费的工程网站网站seo推广平台
  • 公司网站建设服务百度关键词挖掘
  • 做网站是不是要模板宁波seo优化费用
  • wordpress下载站主题汕头网站建设方案维护
  • 贵阳网站开发公司黄页网站推广
  • 有了域名怎样做淘客网站百度怎么优化网站关键词
  • 苏州网站建设多少钱网站seo分析
  • 南县做网站推荐百度服务电话在线人工
  • 合浦建设局网站网页入口网站推广
  • 组织网站建设应该注意什么关键词优化seo
  • 龙华三网合一网站建设网站做优化一开始怎么做
  • 做爰全过程免费的视频99网站搜索引擎优化seo课程总结
  • 安阳网站自然优化推广链接怎么制作
  • 龙岗区网站建设哪个公司好外贸平台自建站
  • 空间怎么上传网站同城发广告的平台有哪些
  • 昆凌做的广告买化妆品网站公司网络营销推广方案
  • 邯郸做网站的博客市场调研的内容
  • 网站如何发布和推广miy188coo免费入口
  • 成都网站建设外贸如何制作自己的网站?
  • 哪个网站做浏览器主页北京网站推广
  • 七星迪曼网站建设今日深圳新闻最新消息
  • 免费做问卷的网站好aso优化排名违法吗
  • 前端2024年好找工作吗福州短视频seo平台
  • 产品拍摄东莞seo顾问