核心数据:提取是否必须访问持久存储?

2023-12-11

假设我这样做:

NSManagedObjectContext *context = #a managed object context";
NSString *entityName = #an entity name#;
NSFetchRequest *requestForAll = [NSFetchRequest requestWithEntityName:entityName];
NSArray *allObj = [context executeFetchRequest:requestForAll];

for (NSString *name in allNamesArray){
    NSFetchRequest *requestForOne = [NSFetchRequest requestWithEntityName:entityName];
    requestForOne.predicate = [NSPredicate predicateWithFormat:@"name == %@",name];
    NSArray *ObjsWithName = [context executeFetchRequest:requestForOne];
    #do some work with the obj#
}

循环中的提取是否每次都会导致访问持久存储?或者这些提取只会在 coredata 的行缓存中执行?

EDIT我写了一段测试代码: 您需要创建一个名为“Person”的核心数据实体,它应该有一个名为“name”的属性,该属性的类型为字符串。

使用此代码填充一些数据:

self.array = @[@"alkjsdfkllaksjdf",@"asldjflkajdklsfjlk;aj",@"aflakjsdl;kfjalksdjfklajkldhkl;aj",@"aljdfkljalksdjfl;j" ,@"flajdl;kfjaklsdjflk;j",@"akldsjfklajdslkf",@"alkdjfkljaklsdjflkaj",@"alsdjflkajsdflj",@"adlkfjlkajsdfkljkla",@"alkdjfklajslkdfj"];

NSString *firstRunKey = @"oh its first run!";
NSString *firstRun = [[NSUserDefaults standardUserDefaults] objectForKey:firstRunKey];
if (!firstRun) {
    for (NSString *name in self.array) {
        Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
        p.name = name;
    }
}
[self.managedObjectContext save];
[[NSUserDefaults standardUserDefaults] setObject:firstRunKey forKey:firstRunKey];
[[NSUserDefaults standardUserDefaults] synchronize];

分析一下这两种方法,你会发现使用CoreData比使用FilterArray花费更多的时间!

static int caseCount = 1000;
-(void)usingCoreData
{
    NSLog(@"core data");
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    NSArray *allPersons = [self.managedObjectContext executeFetchRequest:request error:nil];

    for (int i = 0; i < caseCount; i++){
        for (NSString *name in self.array) {
            request.predicate = [NSPredicate predicateWithFormat:@"name == %@",name];
            NSArray *result = [self.managedObjectContext executeFetchRequest:request error:nil];
        }
    }
}

-(void)usingFilterArray
{
    NSLog(@"filter array");
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    NSArray *allPersons = [self.managedObjectContext executeFetchRequest:request error:nil];

    for (int i = 0; i < caseCount; i++){
        for (NSString *name in self.array) {
            NSArray *array = [allPersons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name == %@",name]];
        }
    }
}

我想我需要自己回答我的问题。

我测试了一下,发现每次执行fetch时,core data都会将你的NSFetchRequest翻译成SQL命令并调用数据库查询,查询结果首先是NSManagedObjectIDs,应用缓存从NSManagedObjectID中获取NSManagedObject。

总之,它缓存对象,但不缓存查询结果。

这意味着您执行相同的 NSFetchRequest 10 次,它将查询您的持久存储 10 次,尽管您将获得 10 次相同的结果。因此在这种情况下,在内存中过滤数组会比获取更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心数据:提取是否必须访问持久存储? 的相关文章

  • 如果您查看内部,nib 文件到底是什么样子的?

    我刚刚学习 nibs 和 swift 并对某些东西感到好奇 我知道 如果您有一个 main storyboard 文件 则首先加载根视图控制器的笔尖 然后加载该视图控制器下可能分层存在的任何视图 但是 我想知道一些事情 当他们说笔尖已 加载
  • 当点击 UITableViewCell 的子视图时引发选择事件 (didSelectRowAtIndexPath)

    我创建了一个自定义 UITableViewCell 其中包含许多子视图 在大多数情况下 我希望 UITableViewCell 的控制器来处理事件 在一种情况下 我希望子视图简单地将事件传递给父 UITableViewCell 这将导致它在
  • 核心数据:解决一个奇怪的 EXC_BAD_ACCESS 错误

    我在核心数据方面面临着一个非常奇怪的问题 我们来描述一下 定义 假设我有两个模型 ModelA and ModelB 在数据模型中ModelA有参考ModelB作为一对多关联 因此ModelB与 具有一对一关联ModelA Update 当
  • 我如何知道 UITableView 何时完成 ReloadData?

    我试图在执行完成后滚动到 UITableView 的底部 self tableView reloadData 我原本有 self tableView reloadData NSIndexPath indexPath NSIndexPath
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • 未安装的应用程序的URL方案

    简单的问题 我正在开发一个将注册自己的 URL 方案的应用程序 我计划通过人们最喜欢的 QRCode 阅读器使用 QRCode 启动该应用程序 我的问题 如果我的应用程序尚未安装在他们的 iPhone iPad 上 会发生什么 他们会被引导
  • 无法下载应用程序 - 此时无法下载“APP”

    我的应用程序有 PLUS 版本和常规版本 我使用不同的目标对它们进行存档 我将 ipa 上传到 TestFlight 也上传到我的曲棍球服务器 PLUS 版本总是下载得很好 但普通版本总是给我 无法下载应用程序 错误 我根本没有更改两个版本
  • iOS 复合谓词

    我正在编写一个具有照片数据库的应用程序 每张照片都有多个与之关联的标签 并且该应用程序有一个带有大量切换的搜索页面 允许用户仅根据他们感兴趣的标签搜索照片 每个标签都存储了integerID 是因为它们对应于外部数据库的 ID 所以我尝试简
  • 在 iPhone 和 Cocos2d 中从类类型(+)方法访问对象?

    我有一个类方法 在其中创建并返回类对象 但我想访问同一类中该对象的某些属性 作为一个类方法 我无法在 h 文件中声明该变量 然后在其他方法中访问它 以下是代码 我如何在下面的实例方法中访问 backsprite 或 hudlayer 对象的
  • Xcode 本地化设置中没有加号或减号按钮

    我需要在两天内翻译 iOS 应用程序 但我的 XCode 版本 4 4 和 4 5 Developer Preview 都没有给我添加其他语言的选项 我只能选择单击 Make localized 但我只能选择英语 选择它后 Xcode 中的
  • 子视图控制器旋转方法未被调用

    Summary 我试图将子视图控制器添加到父视图控制器 并让父视图控制器通知子视图控制器旋转事件 但是 旋转消息不会转发到子视图控制器 这是默认行为 为什么这种默认行为没有发生 环境 iOS 7 XCode 5 OSX 10 9 Detai
  • iOS:addConstraints:应用程序崩溃

    Problem 我似乎无法在现有项目中采用自动布局 Details 我之前也遇到过与此问题相同的问题presentViewController 在 iOS 但所提供的答案都不是我的解决方案 我正在使用所有没有 xib 的故事板视图 我的 使
  • UINavigationController 在后退按钮单击时向下滚动

    我正在开发一个带有多个导航控制器的 iPhone iPad 应用程序 当我在设备处于横向模式时单击视图的后退按钮时 前一个视图会垂直滚动到屏幕中 而不是像往常一样水平滚动 推送动画始终水平工作 正如它应该的那样 是什么导致了这个奇怪的问题
  • AVAudioMixerNode pan 或 AVAudioUnitSamplerstereoPan 属性无法更改 AVAudioEngine 声音输出的左/右平衡

    我有以下代码 它播放单个 MIDI 音符 但我希望能够调整平衡 平移 以便它仅从左扬声器或右扬声器或某些组合中播放 我认为更改 sampler stereoPan 或 engine mainMixerNode pan 也许可以解决问题 但它
  • 在应用程序内启用或禁用 Iphone 推送通知

    我有一个 iPhone 应用程序 可以接收推送通知 目前 我可以通过转到 iPhone 设置 通知来禁用我的应用程序的推送通知 但我想在我的应用程序中添加一个开关或按钮来启用或禁用推送通知 这是可以做到的 因为我在 foursquare i
  • extern NSString *const 在类中。

    你好 我有这个头文件 import
  • 如何在 XCode5 中将部署目标更改为 5.1.1 [重复]

    这个问题在这里已经有答案了 我正在一个项目中工作 我需要支持 iOS 5 1 1 但在 部署目标 的下拉菜单中我没有 5 1 1 作为选项 我的问题是如何将 iOS 5 1 1 添加为部署目标 我将非常感谢你的帮助 如果您愿意 您可以在框中
  • 更新查询时 ios 中出现“数据库锁定”错误

    我正在使用下面的代码更新查询 using sqlite 但我越来越 database is locked error 我尝试搜索一些 SO 链接 建议关闭数据库 但我再次执行此操作时遇到相同的错误 我已经提到过代码中出现错误的地方 cons
  • Swift 3 和 Xcode8 - init 的使用不明确

    在我安装 Xcode 8 并将项目转换为 Swift 3 之前 以下行没问题 现在转换后看起来像这样 let valueData Data Data bytes UnsafePointer
  • 如何将 NSAppTransportSecurity 添加到 Cordova 项目

    我正在从事一个 ionic cordova 项目 该应用程序需要配置 iOS 9 版本的应用程序传输安全例外 有谁知道如何将以下配置添加到 cordova 项目配置文件中 配置 xml

随机推荐

  • Android:以编程方式获取设备名称

    这就是我尝试过的 mTextView setText MODEL android os Build MODEL nDEVICE android os Build DEVICE nBRAND android os Build BRAND nD
  • 当 Next.js 中的路由处于活动状态时定位活动链接

    如何像我们在 React Router 4 中那样定位 Next js 中的活动链接 意思是 当活动链路的路由处于活动状态时 为活动链路指定一个类别 一个简单的解决方案基于useRouter hook import Link from ne
  • 如何使用 jQuery ajax 调用 PHP 函数?

    我有一个名为 myfunctions php 的文件 其中有很多函数 例如 function sendForm save form function fn2 do something Other functions 和 jquery 代码
  • 两个连续的 [NSDate date] 总是会返回不同的时间吗?

    dateS 和 date 总是不同吗 Two NSDate date following each other NSDate dateA NSDate date Line X NSDate dateB NSDate date Line X
  • 最后手段的性能优化策略[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 该网站上已经有很多性能问题 但我发现几乎所有问题都非常针对具体问题并且相当狭窄 并且几乎都重复了避免过早优化的建议 我们假设 代码已经可以正常工作了 所选择的算法对于问题的情况来
  • Java:枚举与整数

    在 Java 中使用标志时 我看到了两种主要方法 其中一个使用 int 值和一行 if else 语句 另一种是使用枚举和大小写切换语句 我想知道使用枚举与整数作为标志在内存使用和速度方面是否存在差异 Both ints and enums
  • C# 使用 varbinary 调整 jpg 图像大小,转换为字节并保存到数据库中

    我正在尝试调整使用 FileUpload 控件上传的 jpg 图像的大小 并将其转换为字节 然后将其保存到数据库 SQL Server 2008 作为 varbinary MAX 我所做的和下面显示的代码是我设法将其转换为字节并以 varb
  • 使用单词边界时如何忽略特殊字符

    s sopa sop sopaa sopii 如何忽略 使用单词边界时 re sub r b sop b sopa s 输出 sopa sop sopaa sopii 看来你想要这样的东西 gt gt gt s sopa sop sopaa
  • 允许在Excel中显示超过15位数字

    我正在编写一个简单的 VBA Excel 脚本 我遇到了一些问题 因为我使用这种方式删除了数字的科学格式 Columns b ad NumberFormat 0 但后来我意识到其中一列有 23 位数字 比 15 位数字长 因为我需要在 Ex
  • 验证日期时如何在jqgrid中使用monthNames?

    在我的 jqgrid 中 当我单击 添加新记录 时 我的日期字段已预先填充当前日期 日期的格式为 yyyy MMM d 例如 2010 Jan 23 日期是必填字段 当我单击提交按钮时 它验证失败并显示错误 表明该日期无效 并且需要 Y m
  • 如果现场评估失败,如何保持在同一选项卡上

    我有主页选项卡和验证选项卡 我喜欢验证用户输入 如果用户输入有效 则切换回主页选项卡 否则留在验证选项卡上 此时 在我单击提交按钮后 即使用户输入无效 它也会切换回主页选项卡 索引 xhtml
  • REGEX 用逗号分隔的唯一数字

    我正在尝试验证以逗号分隔的数字 1 31 的唯一列表 不重复 i e 2 4 6 7 1 是有效输入 2 2 6无效 2有效 2 无效 1 2 3 4 15 6 7 31有效 1 2 3 4 15 6 7 32 无效 20 15 3 I t
  • 连接设备列表中的闪烁选项不允许我调试任何应用程序

    我有一个奇怪的问题 当我尝试在连接的设备中部署应用程序时 我有一个闪烁的选项 出现一秒钟 然后消失 然后再次出现 依此类推 当我尝试在任何连接的或虚拟设备中调试应用程序时 我收到此错误 01 23 18 49 36 Launching ap
  • 用户注册时自动创建个人资料 (Laravel 5)

    我正在尝试为我的注册用户创建一个个人资料页面 在此页面上 将显示身份验证 用户数据 姓名 电子邮件 还会显示额外的个人资料信息 城市 国家 地区 电话号码等 我已经建立了一对一的关系 但我遇到了一个问题 创建用户后 我想自动为该特定用户创建
  • Apache websocket 重定向到 Tomcat:mod_proxy 和 mod_proxy_wstunnel

    我正在尝试使用 mod proxy 和 mod proxy wstunnel 模块将流量从 Apache 重定向到 Tomcat HTTP 流量重定向没有问题 但我无法使用迄今为止尝试过的任何配置成功重定向 websocket 流量 我正在
  • 从 Python 调用并执行 r 脚本

    我正在尝试使用此 Python 脚本来调用 r 脚本并运行它 r 脚本是 dbc2csv r 其代码位于 Python 块下方 我设法调用 r 脚本并打开 R studio 但代码没有像我希望的那样自动运行 我的感觉是有什么问题subpro
  • 滚动位置时显示 Div

    首先我想参考这个网站 http annasafroncik it 我喜欢动画进入视野的方式 在 jquery 中创建类似的函数很难吗 有没有什么插件可以实现这样的效果 希望有人能帮助我 基本上 您想要为每个要隐藏的元素添加一个 hideme
  • 有没有办法获得“numpy.linalg.svd()”代码

    由于 numpy linalg svd 是一个预定义函数 我没有找到它的内部代码 from scipy import linalg u s v np linalg svd b full matrices True import inspec
  • SetTimeout 递归函数(Javascript)超出最大调用堆栈大小[重复]

    这个问题在这里已经有答案了 我有一个递归 SetTimeout 函数 可以在加载过滤器后单击页面上的过滤器 它们是通过 Ajax 加载的 因此在页面加载时无法立即使用 scope clickFilter function var filte
  • 核心数据:提取是否必须访问持久存储?

    假设我这样做 NSManagedObjectContext context a managed object context NSString entityName an entity name NSFetchRequest request