在NSAttributedString中添加图像并保存到Core Data性能

我在将带有图像的NSAttrbutedString保存到Core Data时遇到了这个巨大的性能问题。

CoreData架构

有一个UITextView允许用户输入文本以及添加图像。 当用户完成输入并单击“ 完成 ”按钮时,它将保存到CoreData,并显示在TableView中。

以下是单击“完成”按钮时保存内容的方法:

创建一个私有MOC并将AppDelegates managedObjectContext指定为其父MOC。

privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateMOC.parent = managedObjectContext privateMOC.perform { do { try self.privateMOC.save() self.managedObjectContext.performAndWait { do { try self.managedObjectContext.save() } catch { fatalError("Failure to save context: \(error)") } } } catch { print("Could not save \(error)") } } 

有两个问题:

  1. 取决于图像,当我单击“完成”按钮时,UI被阻止,并且在视图被解除并在TableView中显示之前需要3-5秒。

  2. 我检查了实际的数据库.sqlite并发现,一个新添加的条目(UITextView中的文本和图像)使数据库大小增加了近12MB ! (也许图像占用太多空间?)

有关如何解决这些问题的任何建议吗? 谢谢!

在您的用例中,这些问题很难预防。 通过在包含图像的NSAttributedString上使用NSCoding ,您要求的是二进制blob,您无法以任何方式控制编码过程。

  • 可能是图像尺寸膨胀,例如因为您要保存未压缩的数据而不是PNG或JPEG。 但是你无法做任何事情,因为你无法控制NSAttributedString如何处理它。 所以你可能会遇到大数据量。
  • 较长的处理时间可能与前一点有关 – 您无法控制NSAttributedString在内部执行的操作,但很可能很多时间都在处理图像。

如果您自己编码属性字符串而不是使用可转换属性,则可以改善保存时间。 然后你可以在后台预先启动编码,而不是在保存数据时发生。 您可能无法修复编码时间,但您可能能够更早地实现它并且不那么明显。 但是,只要您使用编码的属性字符串,我认为您的大小就会受到影响。

我不知道你的应用程序正在做什么,但如果你可以远离潜在的大量NSAttributedString你将避免你遇到的问题。