2013-02-14 116 views
0

我有一個對象,我從核心數據加載數據。然後我用用戶輸入/選擇修改對象。模型對象和核心數據

我的第一個雖然是來覆蓋的屬性setter方法:

-(void)setType:(NSString *)type { 
    NSLog(@"setType fired | newType: %@", type); 

    _type = type; 

    appDelegate *appDelegate = (appDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:DEFAULTS_DB]; 

    NSError *error; 

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

    if (fetchedObjects.count == 1) { 
     Defaults *defaults = [fetchedObjects objectAtIndex:0]; 

     defaults.sceneType = type; 
    } 

    if (![context save:&error]) { 
     NSLog(@"Error in saving first run defaults | error: %@", error); 
    } 
    else { 
     NSLog(@"new type was saved to core data"); 
    } 
} 

我的另一個想法是,以更新核心數據時applicationWillResignActive:火災(但該方法只得到了幾秒鐘的應用程序之前運行被凍結)以及用戶何時註銷。

該應用程序我創建一個用戶會啓動,成立了他想要什麼,然後直到他再次使用它,所以我很擔心我的應用程序,同時不活動的被殺害,並把它放下10-60min丟失數據。

是處理更新的好方法更新核心數據在setter方法或者是一個非常糟糕的主意(佔用過多資源,太慢了)?

回答

0

這不是一個典型的使用模式。典型的做法是在顯示數據並保存它之前取出對象。然後,當用戶更改某些內容時,請更新對象屬性並保存上下文。

0

這有點取決於你有多少數據量制定和每次調用你的客戶制定者檢索。我會嘗試你現在正在做的事情(更新設置器中的核心數據),但是在舊設備上測試一下,例如iPad 1,並看看它是如何執行的。在播放一段時間之後,您可以決定是否要用每個設置者更新核心數據。現在

,如果你沒有看到在所有的任何性能差異,我不會擔心。你很好。您可以通過將數據提交給setter來保存用戶最新更新的操作。但是,當您保存更多數據和/或大型文件/圖像時,可能會出現一個問題,而早期的設備開始發現性能存在差異。

爲了事先準備好這種情況,我建議在程序中有一個緩衝區(反映實體的結構),每隔一段時間寫入核心數據 - 可能是應用程序進入不活動狀態,或者如果應用程序進入後臺或每個固定時間段。緩衝區在setter中被更新是非常必要的。您在applicationWillResignActive:中編寫代碼的想法可能會造成打嗝,原因在於您在處理崩潰方面的準備情況。崩潰可以隨時出於任何原因,有時可能不是因爲你自己的錯誤代碼。這是爲什麼有緩衝區是個好主意的強有力的理由。您在碰撞期間(最壞的情況)要麼丟失一小塊小數據,要麼達到性能+一致性(最好的情況)。