我想做的事: 我想在细分中选择商店的名称,并仅过滤出该特定商店中的商品。 示例: “我只想在亚马逊上看到商品” 解: 我在Discord中的小组成员之一,名为ValentinasM。 他教我这种方法。 您只需要在您的段代码中实现此代码。 这意味着,它只会仅显示亚马逊商店中的商品。 toStore在项目的关系中。 .name在商店实体中。 最终结果: 所以现在当我按亚马逊时 ,它只会显示亚马逊中的项目。
多个托管对象上下文 Core Data的默认配置为您提供了与主队列关联的单个托管对象。 刷新托管对象上下文是一个内存暂存器,您可以在使用托管对象时使用它。 什么时候需要多个托管对象上下文? 1.编辑数据→可以将托管对象上下文视为一组更改,应用程序可以通过子上下文丢弃这些更改。 可以将编辑的数据视为新信息,例如便笺本。 数据编辑后,您可以保存或删除。 2.导出数据(长时间运行的任务)→仅使用单个主队列管理对象上下文来阻止应用程序的主线程,然后UI会被阻止并且无法正确更新。 导出数据时的默认行为是让您的导出操作和UI都使用主队列执行其工作,但是如果此导出是一项长期运行的任务,则UI将滞后并且会有延迟。 传统上,您可以将数据导出运行到后台队列中,但是Core Data受管对象上下文不是线程安全的。 您不能将操作分派到后台队列,也不能使用相同的Core Data Stack。 Apple开发者网站上有关您的上下文的一些上下文: 通常,避免在与用户无关的主队列上进行数据处理。 数据处理可能会占用大量CPU,并且如果在主队列上执行数据处理,则会导致用户界面无响应。 如果您的应用程序将要处理数据,例如将数据从JSON导入到Core Data中,请创建一个私有队列上下文并在该私有上下文上执行导入。 以下示例显示了如何执行此操作: 让我们看一下第5行中发生的情况。新上下文设置为运行该应用程序的主要上下文的子级。 子托管对象上下文是临时暂存器,从本质上讲,它是可编辑更改的容器,可以将其丢弃或修改并随父上下文的更改一起保存。 保存子上下文后,更改仅转到父上下文。 保存父上下文后,父上下文中的更改将发送到持久性存储协调器。 此外,每个管理对象上下文都有一个父存储,如果它是CoreDataStack类提供的主要上下文,则通常是持久存储容器。
2)在步骤1中为模型创建一个实体(半—可选) 3)创建一个持久性存储容器 4)当通知进入后台线程时,创建后台托管对象上下文。 5)分配合并策略 6)创建我们实体的新实例。 7)为新实例分配更新中的属性 8)保存实体 使用领域 这是在Realm中完成此任务所需的步骤 建立模型 2)当通知进入后台线程时,创建一个新的Realm。 3)创建一个新的对象实例。 4)为新实例分配更新中的属性。 5)保存对象。 任务:查询数据以获取特定记录 除了添加和更新数据外,我们还需要查询数据。 让我们看看这里的差异。 核心数据 领域 任务:在数据中查询包含子字符串的记录 让我们扩大查询范围以搜索子字符串。 核心数据 领域 我的印象 与Realm相比,Core Data设置过程耗时更长,工作量几乎翻了一番。 我在此处显示的核心数据代码相当新,仅在iOS 10及更高版本中可用。 在过去的几年中,此设置中涉及的代码将增加3–5倍。 即使在最近几年对Core Data进行了所有改进之后,Realm的设置也更简单,Realm的代码也更易于阅读。 为了简短起见,我不处理Realm错误,而是将Core Data封装在do-catch块中,以防万一。 事实是,我比Realm更害怕Core Data爆炸,但是错误也应该在Realm中处理。 其他的东西 谢谢阅读。 这是对我在博客文章“仅使用贴纸中的MacBook Pro付费”中使用的某些框架的扩展讨论。 说到这,我仍在努力购买MacBook Pro,因此,如果您想在这方面为我提供支持,则可以通过以下方式提供帮助: 1)购买邮票包。 我保证它很棒,使用它会给您带来很多乐趣。 2)分享这篇文章。 3)善良的随机行为。 我更喜欢前两个,但是如果您愿意,可以随时通过PayPal捐款。
本文是“零件中的核心数据优化”的系列文章。 第一部分的链接 在这里 。 在跳到下一条规则之前,假设您的应用程序必须处理昂贵的对象,并且花大量的CPU资源和时间来初始化此类对象。 图像库就是这样一个示例,其中实际图像由占位符图像Thumbnail代替,它是实际图像的较小表示形式-一种代理。 但是,如果我们要求图像尺寸,则它带有实际图像尺寸。 缩略图具有两个有趣的功能: -a )。 提供较少的内存b)。 具有与实际图像相似的界面(getSize或大小) 使用此缩略图可以减少内存占用,但是当您查询getSize()或大小时,它会返回实际的图像大小。 与该设计相关的软件模式是代理模式 。 核心数据提取操作按照相同的设计原理进行,并在执行提取时创建故障对象(如缩略图)。 故障对象是托管对象的代理,该代理的内存较少,因为它的所有属性均未初始化 我们如何获得属性? 一旦我们尝试访问任何属性,核心数据就会在此处进行优化- 例如,雇员实体具有薪水属性,然后访问持久性存储以从获取的值中填充属性。 击中持久性存储以获取属性实际值的过程称为触发错误。 核心数据的惊人行为与持久性存储中的内置缓存机制中的核心数据相关,持久性存储了实际获取的值。 现在,假设您的业务逻辑基于想要执行以下操作的所有薪水数据: 对于employeeRecord { var total + = aEmployee.salary } print(“ Average = \(total / count)” 在此,CD将为每个故障对象触发故障,并将进入永久存储,这反过来又增加了往返时间。 在这种情况下,最好进行单次故障或火灾批次故障,而不要对PS(持久存储)进行单独故障。 使用IN的谓词可以改善情况 关键词 并在fetchRequest 上将returnObjectsAsFaults属性设置为false 。 let谓词= NSPredicate(格式:“ self IN%@”,employeeRecord) fetchRequest。 returnsObjectsAsFaults = false print(“ Average = […]
记住这一点: “切勿在线程之间共享托管对象上下文。 这是一条硬规则,你不应该打破。” “ 并发性是同时处理多个队列上的数据的能力。 ” 如果不了解多线程应用程序中的场景和用例,则对核心数据概念的了解将是不完整的。 老实说,Apple文档没有以简单的方式解释这些用例。 让我们从基础开始: 考虑以下两个问题: 如果从不同的线程访问相同的管理对象上下文,会发生什么情况? 如果将托管对象从后台线程传递到主线程会怎样? Apple文档非常清楚Core数据希望在单线程上运行 ,而不必是主线程。 核心数据并非旨在从不同的线程访问。 但是,苹果公司的核心数据团队并不幼稚。 它知道需要从多个线程访问持久性框架。 单个线程(主线程)可能适合许多应用程序。 更复杂的应用程序需要一个健壮的多线程持久性框架。 在多线程应用程序中访问核心数据的基本规则: 托管对象: NSManagedObject 实例绝不能从一个线程传递到另一个线程。 如果需要将托管对象从一个线程传递到另一个线程,请使用托管对象的 objectID 属性。 objectID 属性的类型为 NSManagedObjectID 并且唯一标识持久性存储中的记录。 当您将其交给NSManagedObjectID实例时,托管对象上下文知道该怎么做。 您需要了解三种方法: object(with:) existingObject(with:) registeredObject(for:) 第一个方法 object(with:) 返回与 NSManagedObjectID 实例 相对应的托管对象 。 如果托管对象上下文中没有该对象标识符的托管对象,它将询问持久性存储协调器。 此方法始终返回一个托管对象。 知道 如果找不到接收到的对象标识符的记录 ,则 object(with:) 会引发异常。 例如,如果应用程序删除了与对象标识符相对应的记录,则Core Data无法将您的应用程序交给相应的记录。 结果是一个例外。 existingObject(with:) 方法的行为类似。 主要区别在于,如果该方法无法获取与对象标识符相对应的托管对象,则该方法将引发错误。 […]
我在coredata上工作,我想将ManagedObject数组转换为json数组。 作为核心数据的新手,我确实进行了大量搜索,但未能找到满意的答案。 在工作并了解了结构之后,这里是相同的示例代码 func convertToJSONArray(moArray:[NSManagedObject])->任意{ var jsonArray:[[String:Any]] = [] 用于moArray { var dict:[String:Any] = [:] 用于item.entity.attributesByName { //检查是否存在值,然后将键添加到字典中,以避免nil值崩溃 如果让值= item.value(forKey:attribute.key){ dict [attribute.key] =值 } } jsonArray.append(dict) } 返回jsonArray } 此代码忽略了那些可选的键和值,这些键和值在核心数据存储中没有值(或nil值)。 由于此处的参数类型是NSManagedObject(这是所有实体的超类),因此您可以将任何ManagedObject的数组传递给此函数。 例如,Person,Employee等,或核心数据实体中的任何ManagedObjects。 编码愉快🙂!!!!!!
花了点时间来研究一下Core Data的使用,以下是一些摘录,后面有附参考喔! 什么是核心数据? 核心数据不是数据库 ,您不应该期望它像数据库一样。 广义上讲,核心数据是应用程序的模型层。 贯穿iOS SDK的是Model-View-Controller模式中的Model 。 核心数据既不是应用程序的数据库,也不是将数据持久保存到数据库的API。 核心数据是管理对象图的框架 。 就这么简单。 核心数据可以通过将对象图写入磁盘来保留该对象图,但这不是框架的主要目标。 核心数据栈 核心数据堆栈是核心数据的核心。 堆栈的关键对象是托管对象模型 , 持久性存储协调器以及一个或多个托管对象上下文 。 NSManagedObjectModel 托管对象模型表示应用程序的数据模型。 即使Core Data不是数据库,您也可以将托管对象模型与数据库的模式进行比较 ,也就是说,它包含有关对象图的模型或实体,它们具有哪些属性以及它们如何关联的信息。另一个。 NSPersistantStore协调员 顾名思义, NSPersistentStoreCoordinator对象将数据持久保存到磁盘,并确保持久存储和数据模型兼容。 它在持久性存储和托管对象上下文之间进行中介,还负责加载和缓存数据。 那就对了。 核心数据已内置缓存。 持久存储协调员是核心数据乐队的指挥。 尽管它在核心数据堆栈中起着重要作用,但您很少会直接与其交互。 NSManagedObjectContext NSManagedObjectContext对象管理模型对象 ( NSManagedObject类的实例)的集合 。 一个应用程序可能具有多个托管对象上下文。 每个托管对象上下文均由持久性存储协调器支持。 您可以将托管对象上下文视为在其上使用模型对象的工作台。 您加载它们,对其进行操作,然后将其保存在该工作台上。 加载和保存由持久性存储协调器协调。 您可以有多个工作台,例如,如果您的应用程序是多线程的,这很有用。 以上是Core Data的核心要素,ref。是多个的完整教学文章,推荐继续往下读喔! 参考 核心数据和Swift:核心数据栈 自己实作的核心数据(创建,读取,更新和删除记录)的应用范例:https://github.com/piggogo0629/FoodPin ==============后续的参考。 学习:一些重点概念================ 提取记录的核心数据故障 :这是为了核心数据专门的设计,只有真正使用到的时候才会把真实数据加载到内存。 核心数据试图将其内存占用量保持在尽可能低的水平,而实现该目标所使用的策略之一就是错误 。 […]
我还有另一个只有25分钟的视频(单击此处:https://www.youtube.com/watch?v=klZfcT087L4),介绍了如何在iOS开发中使用核心数据来保存用户的输入数据。 我不会解释什么是核心数据以及为什么要使用它。 编写该故事的目的只是为了便于学习,或在我的后续工作中使用快速教程来快速设置环境并开始使用核心数据。 生成新项目,选择核心数据: 3.从“添加实体”中添加实体名称(托管类),并为每个类添加属性(如果属性是可选的,请确保选中此框)。如果您的属性是托管类,请选择“可转换”作为dataType 4.确保以这种方式设置设置: 5.并为此托管类生成swift,然后检查要生成的属性。 6.然后,您需要另一个swift文件来生成persistentContainer,并在需要时保存saveContext()函数,如果您有多个托管对象,则将persistentContainer与其他容器分开。 确保名称“ RecipeModel”与您的核心数据文件名称匹配。 7.将实体添加到核心数据persistentContainer 8.从核心数据persistentContainer获取对象 context.delete(recipesArray [index])//使用delete方法删除数组中的元素之一。 总结:如果需要保存一组托管对象,最好使用核心数据,但是如果只需要保存一个或两个对象,则userDefault可能是一个很好的解决方案,因为您无需遍历所有这里的代码。 请记住:如果选择保存复杂的类,则核心数据和userDefault都必须具有与NSCoding相关的功能。 因此,两者的准备工作是相似的。 更多代码: 核心数据类:https://www.raywenderlich.com/3444-beginning-core-data
嗨,我回来了,我最喜欢的主题核心数据带有单元测试😀。 希望您对编写单元测试用例有一些基本的了解。 我们将使用XCTestCase类和XCTest框架来编写单元测试并对其进行测试。 源代码在本教程的底部。 单元测试对于测试代码非常有用,而无需在设备或模拟器上启动代码并转到特定的视图控制器。 我们可以非常快速地测试所需的代码,而无需在设备/模拟器上运行。 它将节省大量的开发时间。 一旦您采用了单元测试,它将激发您按照MVVM,依赖注入和适配器模式等编写小的可测试代码。 我将继续第3部分。请从此处下载第3部分源代码。 我在CoreDataManager类中添加了另一个方法。 只需复制以下方法并粘贴到CoreDataManager类中即可。 此方法使用获取请求来获取个人记录并删除它们。 / *在需要刷新人员数据的情况下,可以调用此方法* / func flushData(){ 让fetchRequest:NSFetchRequest = NSFetchRequest (实体名称:“人”) 让objs =试试! CoreDataManager.sharedManager.persistentContainer.viewContext.fetch(fetchRequest) 例如,让obj作为objs中的NSManagedObject { CoreDataManager.sharedManager.persistentContainer.viewContext.delete(obj) } 尝试! CoreDataManager.sharedManager.persistentContainer.viewContext.save() } } 现在,让我们开始设置单元测试: 我们还需要在测试目标中添加PersonData.xcdatamodeld。 请参考所附的屏幕截图,并仔细查看右侧底部的Target Membership: 让我们复制下面的代码,并将其粘贴到PersonDataTests.swift中。 它看起来应该像这样: // // PersonDataTests.swift // PersonDataTests // //由Alok Upadhyay在18/3/28创建。 //版权所有©2018 Alok。 版权所有。 // 导入XCTest 导入CoreData @testable导入PersonData class PersonDataTests:XCTestCase […]
最近,我一直在为iOS应用程序实现缓存机制。 为了实现这一目标,我设定了以下目标: 利用Codable协议轻松解析来自Web服务的JSON响应并创建适当的模型实例。 将所需的模型实例存储在Core Data中。 这项任务是一次有趣的学习经历。 因此,我决定回到我的示例应用程序之一,以说明如何使数据模型支持Codable并与Core Data Codable工作。 模型:NSManagedObject和Codable 我开始的示例应用程序只有一个简单的模型User ,如下所示: Core Data的用例非常简单:允许离线使用该应用程序(即:当网络连接不可用时)。 实现此目的的最简单方法是,每当应用程序具有网络连接时,就删除并重新创建Core Data数据库。 这就是为什么在parse(…)方法中,在实际解析JSON响应之前调用clearStorage() :在开始添加已解析的User实例之前,我们想清除存储(数据库)。 清除存储所需的代码非常简单,因为我们只需要删除一个表即可: 为了检索存储的User实例, UserController提供了fetchFromStorage()方法: 两种方法都通过NSFetchRequest执行各自的任务。 通过实现上述两种方法,我们现在拥有了与Core Data和User实例成功交互所需的一切。 结论 在这篇文章中,我描述了我使用Codable和Core Data的个人经历。 特别是,我专注于如何无缝解析JSON响应并将结果模型存储在Core Data中的适当数据库表中。 这篇文章中说明的示例应用程序的代码可在GitHub上找到。