我正在使用coredata框架。现在我有一个问题:
我在[1:n]
和Order
对象之间有OrderDetail
的关系。
在第一个tableview中,我使用NSFetchedResultsController
获取Order
的列表。
我的问题是如何计算每个Ordertail
的Order
。
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
我得到了Order
个对象。称之为parent_Object。
计算OrderDetail
的好方法是什么:
NSFetchRequest
与谓词"Order == %@'
,parent_Object一起使用。然后我计算结果提取数组。parent_Object.OrderDetails.count
有什么区别以及哪种方式可以节省执行时间 请帮帮我。
答案 0 :(得分:0)
通常,从核心数据中提取是一项昂贵的工作。但是,在任何一种情况下,您都不应该遇到任何性能问题。要回答您的问题,您应该使用该属性,因为不需要提取或谓词。仅当您过滤某些对象时才使用谓词。那么你在两种方法中所做的是
创建谓词并使用它来获取数组中的所有Order
个对象。然后,您调用计数来获取OrderDetails
的{{1}}总数。
您已拥有管理对象的nsset和呼叫计数。
所以,从逻辑上讲,第二种方式更快,因为你不进行任何提取。但对于小型项目来说,这真的无关紧要。如果您有大量对象并且只想对结果进行采样,则可以在获取请求之前始终在请求上调用Order
。
答案 1 :(得分:0)
如果您在查询时看看苹果会做什么
[paretnt_Object.orderdetails allObjects];
你会发现他们做了一个简单的FetchRequest。
我认为你有两个选择
使用 -
- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error
如果您将使用use fetch请求,此方法将返回仅对您将获得的对象的计数。我相信它更快,因为它不加载对象。
在上一届WWDC上有一篇关于CoreData的讲座。我从讲座中学到的一件事是,您应该尝试以稍后使用它的方式构建数据。如果您知道您经常需要这些获取请求,则可以考虑将 OrderDetail count 存储为订单中的属性,并在每次更改时更新计数。这样,每次添加或减去OrderDetail时都会执行一次,当您同时对多个Order实体执行此操作时,它会快得多。
好运