草庐IT

ios - 了解 CoreData 中 Transformables 的故障

coder 2024-01-17 原文

我的应用程序存在问题,从我的数据库中删除大量数据需要很长时间。所以我开始调试并发现问题出在值转换器上!

为了查看问题,我创建了一个隔离问题的项目...

我有以下内容:

+-----------+     +-----------+
| Entity  A |     | Entity  B |
+-----------+     +-----------+
|           |     | property  |
| b         | 1:1 | a         |
+-----------+     +-----------+

因此 实体 A实体 B 具有 1:1 的关系。 实体 B 有一个名为 property 的属性,它是 Transformable 并且有一个 ValueTransformer。 A到B的删除规则为nullify。

现在我创建了 A 和 B 的一个实例,将它们链接起来并向属性中写入一些内容。保存上下文,一切都按预期工作。

现在我想删除实体A的所有对象。我创建一个获取请求,并删除所有实体。在我的示例中,我是这样做的:

context.perform {
    let fetchRequest = NSFetchRequest<EntityA>(entityName: "EntityA")
    guard let allEntities = try? context.fetch(fetchRequest) else { return }

    for entity in allEntities {
        context.delete(entity)
    }
    try? context.save()
}

现在当保存发生时,值转换器 reverseTransformedValue 被调用。我不明白为什么?!?因为我不访问该属性...我不设置或获取它...

如果有人能为我提供一些启示,那就太好了。

我在这里也有我的示例项目:https://www.dropbox.com/s/651dmyughosr90p/ValueTransformerIssue-Sample.zip?dl=0

最佳答案

这是一个有趣且有点令人惊讶的结果,但我认为这是 Core Data 正常运行的结果。关于 Core Data 的一些背景细节:

  • 当一个对象被读取时,它通常是一个“故障”。除非您将提取请求配置为需要加载,否则不会立即加载属性值。
  • 当故障对象“触发”时,所有 属性值都会被加载。当您访问任何属性值时,这会自动发生,因此如果您查找一个属性,则会加载所有属性值。
  • 为了更改属性值,Core Data 将加载属性值。

在您的情况下,似乎正在发生的事情是:

  • 您获取 EntityA 的实例。
  • 您删除这些实例。
  • 由于您使用“nullify”作为删除规则,删除 EntityA 意味着 Core Data 需要修改相应的 EntityB,方法是将其值设置为 a 到 nil。
  • Core Data 内部需要加载EntityB 实例。由于它正在修改其中一个属性,因此它首先加载所有属性。此时,您的值转换器会执行,即使这里并不真正需要它。

如果您的值(value)转换器正在损害性能,您可能会尝试解决一些问题,包括:

  • 将此属性移至与 EntityB 相关的单独实体。关系错误不会在属性错误发生时触发,因此无效规则不会加载此新实体的实例。
  • 虽然 NSBatchDeleteRequest 不会遵守删除规则(因此不会应用“nullify”),但您可以将其中一个与 NSBatchUpdateRequest 结合使用以修复关系.例如,对 EntityA 实例进行批量删除,然后进行批量更新,以将受影响的 EntityB 实例的关系设置为 nil。

或者当然,也许您的值(value)转换器可以被优化以减少问题?

希望这对您有所帮助。祝你好运!

关于ios - 了解 CoreData 中 Transformables 的故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46238567/

有关ios - 了解 CoreData 中 Transformables 的故障的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  5. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  6. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  7. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  8. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  9. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  10. ruby - 了解 Ruby Enumerable#map(具有更复杂的 block ) - 2

    假设我有一个函数defodd_or_evennifn%2==0return:evenelsereturn:oddendend我有一个简单的可枚举数组simple=[1,2,3,4,5]然后我用我的函数在map中运行它,使用一个do-endblock:simple.mapdo|n|odd_or_even(n)end#=>[:odd,:even,:odd,:even,:odd]如果不首先定义函数,我怎么能做到这一点?例如,#doesnotworksimple.mapdo|n|ifn%2==0return:evenelsereturn:oddendend#Desiredresult:#=>[

随机推荐