2011-12-21 51 views
2

我正在使用coredata框架。現在我有這個問題:
我有關係[1:n]OrderOrderDetail對象。 在第一個tableview中,我使用NSFetchedResultsController來獲取Order的列表。 我的問題是如何計數Ordertail每個OrderCoreData有什麼不同

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 

我得到了Order對象。稱它爲parent_Object。

什麼是計數OrderDetail的好辦法:

  1. 使用NSFetchRequest與謂詞"Order == %@',parent_Object。然後我計算結果獲取數組。
  2. 使用性質:parent_Object.OrderDetails.count

有什麼區別和方式將節省的時間執行。
請幫我一把。

+0

請注意:'count'是不是一個性質,它是一種方法!點語法確實有效,但當它不是一個簡單的getter時,請堅持使用方括號括起來的方法調用! – Joost 2011-12-21 10:06:07

回答

0

一般來說,從核心數據中提取是昂貴的工作。但是,在任何情況下,您都不應該遇到任何性能問題。要回答你的問題,你應該使用屬性,因爲不需要提取或謂詞。謂詞僅在過濾某些對象時使用。所以,你在做什麼在這兩種方法是

  1. 創建謂詞和使用來獲取數組中的所有Order對象。然後,您打電話給Order以獲取OrderDetails的總數。

  2. 您已經擁有一組nsset的管理對象並對其調用計數。

因此,從邏輯上講,第二種方法更快,因爲您不執行任何提取操作。但對於小型項目來說,這確實不重要。如果您有大量對象並且您只想對結果進行抽樣,則可以在請求之前始終在請求上調用setFetchLimit:

+0

如果使用setFetchLimit :,你怎麼能得到完全數量的orderdetail? – Clover03ti05 2011-12-21 07:47:28

+0

你無法獲得號碼。我剛纔提到了setFetchLimit:作爲一種方法,可以在您擔心效率的不同場景中使用。你應該使用parent_Object.OrderDetails.count – MadhavanRP 2011-12-21 07:50:19

0

如果你會看,當你問

[paretnt_Object.orderdetails allObjects]; 

你會發現,他們做了一個簡單FetchRequest蘋果做了什麼。

我覺得你有2個選項

  1. 使用 -

    - (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error 
    

    此方法將返回只計數對象的,你會得到,如果你會使用使用讀取請求。我相信它不會加載對象速度更快。

  2. 在上次的WWDC中,有關於CoreData的講座。我從演講中學到的一件事就是你應該儘量以後面將要使用的方式來構建數據。如果您知道您將經常需要這些提取請求,那麼您可以考慮將OrderDetail計數作爲屬性存儲在訂單中,並在每次更改計數時更新計數。這樣,每次添加或減去OrderDetail時,您都會執行一次,而且您將一次執行多個Order實體時速度會更快。

GOOD LUCK

+0

感謝您的建議。但是如果比較你的第一種方法和NSSet的計數,那麼什麼是好方法? – Clover03ti05 2011-12-21 07:48:31

+0

你已經取得了這個集合嗎?你是從NSSet那裏得到的嗎?對我來說,第二種方法將是最好的,你是經常去的。否則使用第一個。 – shannoga 2011-12-21 08:50:09