【发布时间】:2012-01-17 11:23:48
【问题描述】:
由于并发和多线程,我的核心数据随机崩溃。我知道核心数据不是线程安全的。我还找到了其他几个关于如何创建 ThreadedDataService 并为每个线程实例化单独上下文的答案。
这对我来说有点太多了,所以我正在努力寻找更简单的出路。
我目前尝试的解决方案很简单:通过主线程保存数据。但是,现在出现了一个新问题:死锁。该应用程序变得无响应,因为我每次插入新的 NSManagedObject 之后都会调用保存。 (这是我最好的猜测)。
阅读 App Delegate 文档,我注意到它建议我将上下文保存在 applicationWillTerminate 中。
我的问题是:对于每分钟插入新事件的长时间运行的操作,并且用户不需要立即看到传播到所有控制器的更新,什么时候是我保存上下文的好时机? 我觉得为每条记录保存上下文可能有点过头了?
-(void)insertNewEvent
{
// Create a new instance of the entity managed by the fetched results controller.
NSManagedObjectContext *context = [self.fetchedResultsController.managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsControllerfetchRequest] entity];
Event*newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
//use accessor methods to set default values
// Save the context. > IS THIS REALLY NEEDED HERE?
NSError *error = nil;
if (![context save:&error])
{
}else
{
if(newManagedObject!=nil)
{
currentState= newManagedObject;
[currentRecord addEvent:newManagedObject];
//Is this call needed?
[self saveApplicationRecords];
}
}
}
我为我的所有托管对象定义了类似的方法,如果我每 10-15 分钟在主线程上调用此类方法来保存待处理的更改,而不是在每次插入记录后这样做就足够了吗?
-(void)saveApplicationRecords
{
NSLog(@"saveApplicationRecords");
NSManagedObjectContext *context = [self.applicationRecordsController.managedObjectContext];
// Save the context.
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
}
看了macbirdie的回复后补充一个问题:这种方法在core data中合法吗?
-(Event*)insertAndReturnNewEventWithDate:(NSDate*)date_ type:(int)type
{
NSManagedObjectContext *context = [self.dreamEventsController managedObjectContext];
NSEntityDescription *entity = [[self.dreamEventsController fetchRequest] entity];
DreamEvent *newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
//handle properties
NSError *error = nil;
if (![context save:&error])
{
return nil;
}else
{
return newManagedObject ;
}
}
谢谢!
【问题讨论】:
标签: iphone objective-c ios core-data concurrency