2016-06-22 46 views
0

我的數據模型有一個具有2個屬性的ClickerRecord實體:date(NSDate)和numberOfBiscuits(NSNumber)。每次添加新記錄時,都可以輸入不同的numberOfBiscuits值。我可以執行單個獲取請求嗎?它會返回結果子集的獨立計算?

要計算餅乾數量的日均值,我目前正在爲範圍內的每一天執行提取請求,並使用相應的NSExpression來計算當天所有numberOfBiscuits值的總和。

問題:我使用異步獲取請求來避免阻塞主線程,因此當第一條記錄和最後一條記錄之間有很多天時,結果會很慢。提取請求一個接一個地執行。 我也可以將所有記錄加載到內存中並執行排序和計算,但是我擔心記錄數量變得非常大時可能會成爲問題。

因此,我的問題:是否有可能使用NSExpressions爲每個日期間隔添加子謂詞之類的東西,以便執行單個獲取請求並檢索包含numberOfBiscuits每日總和的條目的字典? 如果不是,這種情況下推薦的方法是什麼?

我已閱讀關於子查詢,但據我瞭解,他們不打算用於這種用途。

這是我在問關於SO的第一個問題,所以我希望以明確的方式:)

回答

1

來寫它,我認爲你正在尋找的是propertiesToGroupBy(見Apple Docs)爲NSFetchRequest,雖然在你的情況下,它並不是直接執行,因爲我將在稍後討論。

假設您可以指定每次消耗的餅乾類別,並將其存儲在實體的category屬性中。然後,獲得各類別(忽略日期)的餅乾的總數,你可以使用一個NSExpression使用@sum並指定:

fetch.propertiesToGroupBy = ["category"] 

CoreData然後將組的結果由category獲取和將計算分別爲各組總和。

你的情況的問題是,(除非你已經去掉從date屬性的時間信息),也沒有屬性,表示您要分組日期間隔,而CoreData不會讓你指定一個計算值以進行分組。您需要爲您的實體添加一個新的day屬性,並計算出每當您添加/更新記錄並在組中指定它時。如果您隨後想要在不同的時間間隔(例如幾周或幾個月)內計算您的平均值,您又會面臨同樣的問題。另一個缺點是,結果將只包括days,其中ClickerRecords:如果用戶有一天他們不消費餅乾,那麼獲取將不會顯示當天的結果(即它不會推斷一個平均值0)。使用結果時需要適當處理。

要調整異步獲取或者如您所建議的那樣只是將整個內容讀入內存以執行計算可能會更好。如果你的實體只有這兩個屬性,並假設你的用戶不完全生活在餅乾上,那麼這些卷應該不會太成問題。

+0

事實上,不同的時間間隔(周,月,...)將是一個問題。我會在內存中進行計算。該實體將具有更多的屬性,但我只是拿這兩個,以保持其足跡低。希望對於大多數用戶來說,卷不會有問題。否則,我應該添加一個fetchBatchSize?感謝您的輸入! – Rygen

相關問題