优化此核心数据请求

2023-12-11

我在核心数据中有一个名为 MusicInterest 的实体。我必须一次添加 5000 个左右,我当前的流程是查询 MusicInterest 是否已存在,如果不存在则创建一个新的。

看来这需要去商店 5000 次才能查看每个标题是否存在。当然,还有插入行程,但 5000 个查询才是拖慢我速度的原因。

每个 FacebookFriend 都会有多种音乐兴趣,我使用一系列字符串标题来枚举每个音乐兴趣,并调用以下代码。

有什么想法如何优化这个吗?

+ (MusicInterest*) musicInterestForFacebookFriend:(FacebookFriend*)facebookFriend WithTitle:(NSString*)musicTitle UsingManagedObjectContext:(NSManagedObjectContext*)moc
{
    // query to see if there
    NSArray *matches = [self queryForMusicTitle:musicTitle moc:moc];

    if (([matches count] >= 1)) {
        // NSLog(@"Music already in database");
        MusicInterest *existingMusic = [matches lastObject];
        [existingMusic addLikedByObject:facebookFriend];
        return [matches lastObject];
    } else {
        // create new Music Interest
        MusicInterest *newMusic = [NSEntityDescription insertNewObjectForEntityForName:@"MusicInterest" inManagedObjectContext:moc];
        newMusic.title = musicTitle;
        [newMusic addLikedByObject:facebookFriend];
        return newMusic;
    }
}

+ (NSArray *)queryForMusicTitle:(NSString *)MusicTitle moc:(NSManagedObjectContext *)moc
{
    // query to see if there
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MusicInterest"];
    request.predicate = [NSPredicate predicateWithFormat:@"title == %@", [NSString stringWithFormat:@"%@", MusicTitle]];

    NSError *error = nil;
    NSArray *matches = [moc executeFetchRequest:request error:&error];
    if (error) {
        NSLog(@"Error querying title in Music interest. Error = %@", error);
    }
    return matches;
}

UPDATE:

我采用了 Core Data 编程指南中建议的设计,它将我的时间从 12 秒减少到 4 秒(其他方面仍然需要一些优化:)

该指南仅包含一半的示例代码 - 我想我会分享我的完整实现:

musicArray = [[music componentsSeparatedByString:@", "] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                if (obj1 > obj2)
                    return NSOrderedDescending;
                else if (obj1 < obj2)
                    return NSOrderedAscending;
                return NSOrderedSame;
            }];

            if (musicArray) {

                NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MusicInterest"];
                [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"title IN %@", musicArray]];
                [fetchRequest setSortDescriptors:
                 @[[[NSSortDescriptor alloc] initWithKey: @"title" ascending:YES]]];

                NSError *fetchError = nil;
                NSArray *musicInterestMatchingTitles = [backgroundContext executeFetchRequest:fetchRequest error:&fetchError];

                if ([musicArray count] > 0) {
                    // walk musicArray and musicInterestsMatchingTitles in parallel
                    for (int i = 0; i < [musicArray count]; i++) {
                        NSString *title = musicArray[i];
                        if (i < [musicInterestMatchingTitles count]) {
                            MusicInterest *comparingMusicInterest = musicInterestMatchingTitles[i];
                            // compare each title
                            if (![title isEqualToString:comparingMusicInterest.title]) {
                                // if it doesn't exist as a ManagedObject (a MusicInterest), create one
                                MusicInterest *musicInterest = [MusicInterest createNewMusicInterestUsingManagedObjectContext:backgroundContext];
                                musicInterest.title = title;
                                [musicInterest addLikedByObject:friend];
                            } else {
                                // otherwise, just establish the relationship
                                [comparingMusicInterest addLikedByObject:friend];
                            }
                        } else {
                            // if there are no existing matching managedObjects, create one
                            MusicInterest *musicInterest = [MusicInterest createNewMusicInterestUsingManagedObjectContext:backgroundContext];
                            musicInterest.title = title;
                            [musicInterest addLikedByObject:friend];
                        }
                    }
                }
            }

        }];
        [self saveBackgroundContext:backgroundContext];

高效实施查找或创建《核心数据编程指南》中描述了一种可能在这里有用的模式。基本思想是:

  • 按也存储在中的某个唯一 ID 对要插入/更新的项目列表进行排序 数据库。
  • 执行一个单个获取请求从数据库中获取列表中具有 id 的所有对象,并按相同 id 排序。
  • 现在并行遍历列表和获取的项目数组,以查找哪些项目必须插入以及哪些项目已经存在并且可以更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化此核心数据请求 的相关文章

  • iOS 新手。预期的表达错误?

    这看起来很不寻常 因为该方法与我的 showAnswer 方法完全相同 所以我想我应该在这里问 import QuizViewController h interface QuizViewController end implementat
  • 如何在 iPhone 应用程序的 url 中传递字符串值

    NSURLRequest request NSURLRequest requestWithURL NSURL URLWithString http www krsconnect no community api html method ba
  • just_audio 无法在 ios flutter 上工作未处理的异常:(-11800)操作无法完成

    我正在尝试从它自己的存储库运行 just audio 示例项目https github com ryanheise just audio tree master just audio example https github com rya
  • 当 iPhone 设备方向朝上/朝下时,我可以判断它是横向还是纵向吗?

    我得到这个代码 如果设备处于左 右横向或上下颠倒状态 它会旋转并显示另一个视图控制器 但如果它的方向朝上或朝下 那么我如何判断它是横向模式还是纵向模式 因为我只想在它面朝上或朝下以及横向模式下旋转 void viewDidAppear BO
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • 取消交互式 UINavigationController 弹出手势不会调用 UINavigationControllerDelegate 方法

    如果拖动 a 的边缘UIViewController开始交互式流行过渡UINavigationController the UIViewController在电流下方有viewWillAppear 调用 然后是UINavigationCon
  • 未安装的应用程序的URL方案

    简单的问题 我正在开发一个将注册自己的 URL 方案的应用程序 我计划通过人们最喜欢的 QRCode 阅读器使用 QRCode 启动该应用程序 我的问题 如果我的应用程序尚未安装在他们的 iPhone iPad 上 会发生什么 他们会被引导
  • StoryBoard 2 导航控制器指向相同的视图

    有谁知道为什么这不起作用 这样 只有一个选项卡栏加载视图 另一个选项卡栏则显示黑屏 我在没有导航控制器的情况下尝试过 选项卡栏是正确的 而另一个在运行模式下不显示选项卡栏项目 如果有人感兴趣的话我对这个问题的回答 添加两个视图来启动我们感兴
  • 无法下载应用程序 - 此时无法下载“APP”

    我的应用程序有 PLUS 版本和常规版本 我使用不同的目标对它们进行存档 我将 ipa 上传到 TestFlight 也上传到我的曲棍球服务器 PLUS 版本总是下载得很好 但普通版本总是给我 无法下载应用程序 错误 我根本没有更改两个版本
  • 在 iPhone 和 Cocos2d 中从类类型(+)方法访问对象?

    我有一个类方法 在其中创建并返回类对象 但我想访问同一类中该对象的某些属性 作为一个类方法 我无法在 h 文件中声明该变量 然后在其他方法中访问它 以下是代码 我如何在下面的实例方法中访问 backsprite 或 hudlayer 对象的
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • UICollectionviewcell 更改背景

    如果我知道部分编号和项目编号 如何更改单元格中的背景 下面的代码显示了我如何尝试做到这一点 UICollectionViewCell collectionView UICollectionView collectionView cellFo
  • iPhone PhoneGap 电子邮件编辑器 SECURITY_ERR:DOM 异常 18 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用phonegap 中的 i
  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • 获取 Swift 子目录中资源的所有 URL

    我正在尝试为 iOS 应用程序的子目录中的所有资源创建 URL 数组 我似乎无法到达正确的路径 即使我不知道名称 我也希望能够检索 URL 即我不想将文件名硬编码到代码中 Below is a screen shot of the hier
  • SDWebImage 显示缓存中图像的占位符

    在 iOS 5 1 项目 iPad 中使用 SDWebImage 3 我们展示相当大的图像 700x500 并且我们有很多图像 1000 我们预取图像并缓存到磁盘 然后允许用户浏览它们 效果很好 除了当您浏览图像时 您总是会看到占位符显示一
  • iPhone,如何将一张图像叠加到另一张图像上以创建要保存的新图像? (水印)

    基本上 我想拍摄用户从照片库中选择的图像 然后应用水印 即右下角的三角形 上面有应用程序名称 我已经在 Photoshop 中用透明层制作了第二张图像 我尝试了一个函数 我不记得它的确切名称 但它涉及 CGIImages 和蒙版 这将两个图
  • UINavigationController 在后退按钮单击时向下滚动

    我正在开发一个带有多个导航控制器的 iPhone iPad 应用程序 当我在设备处于横向模式时单击视图的后退按钮时 前一个视图会垂直滚动到屏幕中 而不是像往常一样水平滚动 推送动画始终水平工作 正如它应该的那样 是什么导致了这个奇怪的问题
  • 在应用程序内启用或禁用 Iphone 推送通知

    我有一个 iPhone 应用程序 可以接收推送通知 目前 我可以通过转到 iPhone 设置 通知来禁用我的应用程序的推送通知 但我想在我的应用程序中添加一个开关或按钮来启用或禁用推送通知 这是可以做到的 因为我在 foursquare i
  • 如何在 XCode5 中将部署目标更改为 5.1.1 [重复]

    这个问题在这里已经有答案了 我正在一个项目中工作 我需要支持 iOS 5 1 1 但在 部署目标 的下拉菜单中我没有 5 1 1 作为选项 我的问题是如何将 iOS 5 1 1 添加为部署目标 我将非常感谢你的帮助 如果您愿意 您可以在框中

随机推荐

  • 简单的 Html DOM 缓存

    我正在使用 Simple HTML DOM 来抓取 经许可 一些网站 我基本上抓取了大约 50 个不同网站的统计数据 这些数据每天更新大约四次 正如您可以想象的那样 进行抓取需要时间 因此我需要通过进行一些缓存来加快该过程 我的愿景是 DA
  • 使用相当于 AutoFixture 'With' 的匿名值进行广义 Func 包装

    在基于 AutoFixture 的测试中 我尝试尽可能清晰地表达以下内容 当我经过时
  • jquery根据选择值填充表中的文本输入

    我有一个表单 其中包含一个名为 Client ID 的选择以及一些其他文本输入 我需要的是 当用户选择 Client ID 时 我的字段 Address1 Address 2 等应该填充数据库查询的结果 如下所示 SELECT Addres
  • 拟合回归曲面的 3D 图

    我正在尝试制作 3D 图表来绘制拟合回归曲面 我见过以下例子 使用 Matplotlib 在 3d 中绘制线性模型 将散点图与曲面图相结合 3 维数据的最佳拟合曲面 然而 第一个非常过时 不再工作 第二个是相关的 但我在生成值时遇到了一些麻
  • swift 中的 kCGImageAlphaNone 未解析的标识符

    我正在尝试使用 Swift 中的 CoreImage 将图像 纹理 对于 SpriteKit 转换为灰度 我找到了这个答案 https stackoverflow com a 17218546 836501我尝试将其转换为适用于 iOS7
  • 如何从 ASPX.VB 函数内部调用 ASSX?

    我需要从我用 ASHX 制作的 API 中获取一个值 通常它是从 javascript 调用的 但我需要在 ASP NET 中正确调用它 我认为这应该不是问题 但我不确定语法 那么你有几个选择 您可以将 ASHX 中的代码重构为共享库中的代
  • 从 SQL Server 的 XML 执行计划中提取数据

    我的最终目标是从缓存的执行计划中自动提取所有引用的列 这将帮助我们跟踪我们计划的 SSRS 报告集使用的所有列 感兴趣的 XML 数据如下所示
  • 在flutter中拖动widget时如何实现定位线?

    我试图在拖动时获取定位线 紫色线 请参阅该附件以了解有关该问题的更多信息 线条是用canvas drawPoints 在 和 的paint 方法 您可以更改它来绘制虚线 现在 带有黑色实线 它看起来像这样 class FooResizer
  • Canvas getImageData 和 putImageData 部分加载图像

    这是我的代码 我正在上传图像并使用如下 gt var canvas document createElement canvas gt var context canvas getContext 2d gt context drawImage
  • C++ 全局变量和初始化顺序

    比方说 我有以下简单的代码 Main cpp include A h For several reasons this must be a global variable in the project A a1 int tmain int
  • 按组前缀旋转更长的时间

    我需要按列字符串前缀分组更长的时间 下面的玩具示例有两个组 A 和 B 但我需要一个针对任意数量的前缀组的通用 tidyverse 解决方案 toy df set seed 1 df lt data table date rep seq a
  • 尝试仅解析 RSS 源中的图像

    首先 我是一个php新手 我已经查看了问题和解决方案here 然而 对于我的需要 解析对各种文章的深入程度还不够 我的 rss feed 的一小部分内容如下
  • Angular 4:如何包含 Bootstrap?

    我是一名后端开发人员 我只是在玩 Angular4 所以我做了这个安装教程 https www youtube com watch v cdlbFEsAGXo 鉴于此 我如何向应用程序添加引导程序 以便我可以使用 container flu
  • 当 TFramedTransport 打开时,thrift 中的 TNonblockingServer 崩溃

    我一直在尝试用 C 实现一个 Thrift 服务器来与 Python 客户端进行通信 这是我的代码 C 服务器 shared ptr
  • 使用 PHP 克隆 MySQL 到 MySQL

    有人知道一个 PHP 脚本可以将整个 MySQL 数据库克隆到另一台服务器上的另一个数据库吗 作为一种备份 您可以运行 PHP 脚本 例如使用 exec 或 system 调用 例如 mysqldump q C databases myda
  • 删除重复行

    我有一张看起来像这样的桌子 Table1 Id Name 如何编写一个查询来删除所有具有重复名称的行 但保留具有较低 ID 的行 如果您使用的是 SQL Server 2005 或更高版本 With Dups As Select Id Na
  • 仅在使用 Vue 悬停时显示截断的文本

    我尝试过这样的
  • QML 渲染器中的文本在不同平台上有所不同

    我发现不同平台之间的文本呈现不一致 左上角的图像是在 android 中生成的 正如红色引导线所示 它在斜体样式的垂直位置和角度方面与 参考 窗口输出不同 Rectangle width 100 height 50 color grey T
  • 将数组合并为对象数组 JavaScript

    我这里有一个数组 var array firstName Nork lastName James age 22 position writer firstName James lastName Rodel age 25 position p
  • 优化此核心数据请求

    我在核心数据中有一个名为 MusicInterest 的实体 我必须一次添加 5000 个左右 我当前的流程是查询 MusicInterest 是否已存在 如果不存在则创建一个新的 看来这需要去商店 5000 次才能查看每个标题是否存在 当