Coredata:设置相关对象需要太长时间

时间:2017-02-02 02:46:24

标签: swift xcode performance core-data

CoreData实体结构:

Invoice <---->> Invoiceline <<-----> Product

NSManaged对象类实现

// intended to be overridden by the subclass 
class var entityName { /* return the entity name */ }

// generic class function to create new entity
class func create() -> NSManagedObject
{
  let context = // the main context
  let record = NSEntityDescription.insertNewObjectForEntityForName(self.entityName, inManagedObjectContext: context)
  return record
}

示例交易:

let product = // a product object
let invoice = Invoice.create() as! Invoice
let invoiceLine = InvoiceLine.create() as! InvoiceLine

invoiceLine.product = product
invoiceLine.invoice = invoice

// complete the transaction
invoice.checktout()

当coredata中插入的发票数达到200K时,设置invoiceLine's product属性需要的时间太长:

invoiceLine.product = product

所以,我使用XCode工具来检查内存分配,我发现每次invoiceLine.product = product时,coredata都会为invoiceLines加载所有相关的product,在我的情况下为6K invoiceLines的{​​{1}},所以当我将另一个productinvoiceLine相关联时,它将再次加载该特定invoiceLine的所有相关product,最终内存分配得到越来越大。

问题:当我执行此操作时,是否可以阻止coredata加载invoiceLine的所有相关product?{/ 1>?

1 个答案:

答案 0 :(得分:0)

我不知道这是不是一个好习惯,但我设法通过切断productinvoiceline的反向关系来缩短执行时间:

invoiceLine ----> product

这一次,CoreData没有理由为我不需要的特定invoiceline加载所有相关的product,从而提升效果。