2013-02-14 118 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:中编写代码的想法可能会造成打嗝,原因在于您在处理崩溃方面的准备情况。崩溃可以随时出于任何原因,有时可能不是因为你自己的错误代码。这是为什么有缓冲区是个好主意的强有力的理由。您在碰撞期间(最坏的情况)要么丢失一小块小数据,要么达到性能+一致性(最好的情况)。