2012-10-21 170 views
0

我在其中一個應用程序中運行數據模型,其中事件定義了「eventType」關係。這使我可以通過更改其「eventType」關係對象來修改多個事件的外觀。iPhone核心數據可以緩存NSManagedObjects?

我遇到的問題是,在插入事件之前,我檢查下面的代碼是否存在此對象的typeRelationship。這需要一些時間,如果我需要插入大量的對象。

我可以緩存,讀取請求(例如在NSMutableDictionary)的結果,檢查詞典(本地內存),看看是否有給定EventIDEnumNSManagedObject我可以讓緩存永久保存嗎?或者底層對象會在一段時間後變得「過時」嗎?

-(Event*)insertAndReturnNewObjectWithTypeID:(EventIDEnum)eventTypeID date:(NSDate*)date 
{ 

    NSFetchRequest *eventTypesArray = [NSFetchRequest fetchRequestWithEntityName:@"EventType"]; 
    eventTypesArray.predicate = [NSPredicate predicateWithFormat:@"SELF.id == %d", eventTypeID]; 
    NSArray *eventTypes = [[DataManager sharedInstance].managedObjectContext executeFetchRequest:eventTypesArray error:nil]; 

    if(eventTypes.count==0) 
    { 
     DLog(@"ERROR inserting event with type: %i NOT FOUND",(int)eventTypeID); 
     return nil; 
    } 
    else { 

     if(eventTypes.count !=1) 
     { 
      DLog(@"ERROR found %i events with type %i",eventTypes.count,(int)eventTypeID); 
     } 

     EventType* eventType = [eventTypes lastObject]; 

     if(date) 
     { 
//   DLog(@"Returning object"); 
      return [self insertAndReturnNewObjectWithEventType:eventType date:date]; 
     }else { 
//   DLog(@"Returning object"); 
      return [self insertAndReturnNewObjectWithEventType:eventType]; 
     } 



    } 
} 

謝謝你看看我的問題!

回答

0

無法緩存由獲取請求返回的對象數組。只有用於查詢它們的NSManagedObjectContext沒有被釋放時,它們纔是有效的。 NsManagedObject.objectID和從查詢中檢索到的數據可以被緩存並保存,只要你喜歡。您最好將相關數據和對象ID複製到與CoreData對象分開緩存和維護的另一個對象中;並釋放由獲取請求返回的核心數據數組。

0

您正在使用的模式通常被稱爲「查找或創建」:查找其分配特徵匹配的對象,如果它存在則返回它,如果它不存在則創建/填充/返回它。

你可以做的一件事是加速核心數據以外的獨立操作。如果根據您的數據有可能,也許您可​​以遍歷EventIDEnum值,找到需要的唯一值,從而減少執行的提取次數。您只會爲每個EventIDEnum搜索一次。只要你在一個線程/上下文中工作,你可以緩存這些。

當我寫這種代碼時,我發現傳入NSManagedObjectContext作爲參數很有幫助。這使我可以在主線程或專用隊列/上下文中的任何位置使用查找或創建或批量插入方法。這將取代你的[[DataManager sharedInstance] managedObjecContext]電話。