2011-02-16 100 views
0

這是我不確定核心數據。iphone - 核心數據插入新的對象系統負載

假設我有一個這樣的循環:

for (int i=0; i<count; i++) { 

    myManagedClass *myData = [NSEntityDescription insertNewObjectForEntityForName:@"myEntity" 
inManagedObjectContext:context]; 

    // adjust myData properties, something like 
    // myData.name = [name objectAtIndex:i]; 
    // myData.address = [address objectAtIndex:i]; 
    // etc 
} 

顯然,這種循環不改變數據庫的任何東西,除非我提交更改。因爲我相信核心數據是智能的,所以我想我必須把這個外部循環放在循環之外,對不對?我的意思是,我在循環中創建的所有對象都被添加到上下文中,並且一旦循環完成,我提交更改,將它們存儲在數據庫中?

另一個問題:

  1. 將這個循環代表的數據庫訪問(=磁盤訪問)方面上的應用程序的任何負載。我想不,但我更喜歡聽你的意見。
  2. 這種情況有什麼樣的限制?崩潰或耗盡內存之前可以添加多少個對象?這裏最好的做法是什麼?

在此先感謝。

回答

1

主要問題:沒錯。

問題1:第

問題2:這要看你的管理對象的大小。上下文本身沒有限制對象圖的大小,除了可用於應用程序的內存大小以外。

第一個好習慣是利用對象圖中的錯誤。例如,如果您需要與上下文中已有的對象相關的受管理對象(屬於故障)的屬性,則只提取屬性,而不是整個受管對象。如果需要與上下文中的對象相關的與對象相關的對象(在故障中)的屬性(使用故障),請使用KVC僅獲取屬性,將兩個相關對象留在故障中。

第二個好習慣是在適當的時候發送refreshObject:managedObject mergeChanges:NO消息到上下文。通過將參數mergeChanged設置爲NO,此消息將簡單地對對象進行故障並釋放其使用的內存。在極端情況下,您可以發送reset消息來排除上下文中的所有對象。

另外,如果不使用該功能,請將上下文的撤消管理器設置爲nil。最後,當你在一個緊密,重的循環中創建/獲取大量管理對象時,請考慮使用自定義的自動釋放池。例如,

NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; 
for (int i=0; i<count; i++) { 

    myManagedClass *myData = [NSEntityDescription 
      insertNewObjectForEntityForName:@"myEntity" 
        inManagedObjectContext:context]; 

    // adjust myData properties, something like 
    // myData.name = [name objectAtIndex:i]; 
    // myData.address = [address objectAtIndex:i]; 
    // etc 
} 
[localPool release]; 

這取決於您在循環中執行的操作是否有自動釋放池是有用的/相關的。

+0

謝謝!!!!順便說一句,你知道任何教程如何使用撤消管理器?再次感謝! – SpaceDog 2011-02-17 06:45:22