2010-11-10 48 views
1

我有一個CoreData數據庫,其中包含了相互關聯的對象。CoreData:獲取和關聯實體的有效方式

EntityFoo - 屬性:UNIQUEID,關係:一對許多對其他EntityFoo對象,關係:一對許多對其他EntityUnresolvedRelationship對象

EntityUnresolvedRelationship - 屬性:UNIQUEID,inverseRelationship:回EntityFoo對象

當我的iPhone應用程序啓動時,我從Web服務獲取這些對象的信息。我解析Web服務響應並創建Foo實體。當我下載並解析數據並將Foo對象放入CoreData中時,我不想花時間去查找需要與此對象相關的其他EntityFoo對象,並且很可能我還沒有一個Foo對象,如果它還沒有被下載和解析,那麼我很快爲這個關係創建一個UnresolvedRelationship對象,並將uniqueId存儲在它中,這樣我可以在以後解決這個對象的關係。

現在我正試圖找出最有效的方式來遍歷所有Foo或UnresolvedRelationship對象,並在所有Foo對象之間創建適當的CoreData關係。換句話說,最後我想沒有UnresolvedRelationship對象......這只是暫時的...... Foo對象只會彼此有關係。

可能有15,000個Foo對象。

是否有一種很好的方式來獲取所有Foo對象和所有UnresolvedRelationship對象,以便我可以走一個數組並通過它的uniqueId在另一個數組中快速找到匹配的實體,這樣我就可以設置CoreData關係?

無論如何,會愛上任何指針。

回答

2

您應該將此作爲解析來自Web服務的數據的一部分。這將是最有效的方式。你接近這一點的方式是,你是猜測關係查找將是緩慢的。這是一種糟糕的優化方法。

抓取對象並鏈接它們不會很慢,除非您將它們實現(故障)到內存中。如果你錯過了15K個對象,反正它會很慢。

解析時建立關係,在解析過程中有效使用autorelease池,並在解析過程中以一致的間隔重置上下文以保持內存不變。這是最好的選擇。

+0

謝謝馬庫斯。在解析時間過程中,我無法解決所有的關係,因爲我還不知道需要關聯的所有對象。正因爲如此,它似乎是一個兩步過程:拉下所有對象,然後設置所有關係。我目前的解決方法是獲取所有對象,並將其放入基於uniqueId的查找字典中。然後,我獲取所有未解析的對象,然後走過並設置關係。我隨時刪除臨時對象,並在最後保存更改。 – toofah 2010-11-11 16:55:07

+0

在進行這種關係配對之前,您是否保存了對象? – 2010-11-11 22:10:55

+0

是的。在下載和解析操作過程中,我會根據您的建議小心地使用autorelease池來管理內存,並且隨時隨地將對象保存到持久存儲中。 – toofah 2010-11-12 18:35:24

相關問題