2013-10-01 40 views
2

我有iOS Core Data性能問題。使用子查詢提取高效CoreData

假設我們有2個類:「Class_A」和「Class_B」。他們兩人都有自己的ID和彼此之間的一對一關係。

classes

現在讓我們假設我是從,讓我來創建這些類(數據中包含的ID類A和B,以及信息對他們的關係)的網絡下載數據。例如:

  • 「會有Class_A的實例與ID = 1」
  • 「會有Class_A的實例與ID = 2」
  • 「會有Class_A的實例與ID = 3 「
  • 」會有Class_B的實例與ID = 10「
  • 」會有Class_B的實例與ID = 11「
  • 」會有Class_B的實例與ID = 12「
  • 」 Class_A與id = 1將與Class_B連接使用id = 12"
  • 「Class_A使用id = 2將與Class_B連接使用id = 11」
  • 「Class_A使用id = 3將與Class_B連接使用id = 10」

因爲所有這些信息都可以以隨機順序獲得(例如有關X和Y類之間的連接的信息可以在有關類X和Y存在的信息之前下載),所以我使用了另一種實體:關係。

關係包含2個欄位:class_A_id和class_b_id

relationship

每當收到關於ClassA和ClassB的關係的數據,我創建關係實體的實例與根據屬性的值。

比每隔一定時間我遍歷「關係」的實體的所有實例,並試圖建立這樣的關係,正確:

  1. 取「的關係」實體
  2. 的所有實例每個取得的關係根據class_A_id和class_B_id存儲在關係中的ClassA和ClassB的實例如果兩個 - ClassA和ClassB的實例存在 - 在它們之間建立關係。
  3. 從CoreData

刪除實例關係實現這個算法我已經想通了它具有相當低的數量在覈心數據對象的使用時效果很好之後。 問題是,我存儲了成千上萬的「關係」實體(關於它們的信息首先被下載),而關於「ClassA」和「ClassB」存在的信息則被下載的頻率較低。

結果是,每次我嘗試使用「關係」實體創建關係時,我都會獲取數千個包含不存在的類的ID的對象!

所以我解決這個問題是要提高算法的第一步:

而是獲取在CoreData的所有關係,只獲取這些包含存在於系統類的ID。

在SQL它可能看起來是這樣的:

SELECT * from 'Relationship' where 
    (SELECT * from 'ClassA' where id == class_A_id).count == 1 
    AND 
    (SELECT * from 'ClassB' where id == class_B_id).count == 1 

我的問題是 - 如何實現這樣的查詢中CoreData?在那裏使用子查詢?是的 - 如何? :)

+0

而是做這種方式的,你能不能扔掉你的關係實體,而不僅僅是創建實例ClassA和ClassB,並通過他們的關係將它們連接起來?您可以向這些實體添加一個屬性來表明它是佔位符而不是完全填充的實體? –

+0

你也可以模仿你SQL的方式:當你收到X類和Y類時,你可以檢查關係。當您收到關係數據時,您可以檢查Class_A和Class_B。但AE的建議可能會更好。 – user523234

+0

好吧,你可能已經猜到了我的真實應用中的模型有點複雜 - 類「ClassA」和「ClassB」具有比「id」更多的屬性,填充這些屬性所需的數據不會進入只包含它們之間關係的Web響應。 由於我的應用程序的結構,我無法創建這些分類的「假」實體(只有「id」字段填充) - 我需要創建它們才能獲得有關它們的完整信息。 我簡化了我的問題,以便更清楚地問我的問題 – Axadiw

回答

0

如果我理解正確的,如果你不想改變太多你的模型,你有兩個選擇:

  • 第一種選擇:修改請求過程只詢問有關實體的關係,你已經有了,如果你沒有太多類型A,B的實體,這可以很容易地完成。否則實施某種'三角洲',這將避免有成千上萬的關係,你不需要(除非你需要它用於其他目的)。
  • 第二種選擇:當你下載項目時,我認爲這是一個後臺進程,在這種情況下,我會立即在那裏做檢查,而不是不時批量檢查。例如,您正在下載關係,請檢查您是否已經有A或B,並將關係表標記爲完整或不完整(可能會添加兩個屬性aExists bExists)。只要實體A進來,將所有關係中的實體標記爲Exists,對於B來說也是如此,這是class_A_id存在的正常獲取請求。然後該批次可以輕鬆掃描並只獲取標記爲完整的實體,並創建關係。你必須實施一點邏輯,但在我看來事情會變得更快。

新的關係將是:

Relationships { 
    class_A_id, 
    class_B_id, 
    classAexists BOOL, 
    classBexists BOOL, 
    batchRelationshipCreated BOOL, 
} 

那麼你可以反正實現這兩個選項:-)