gpt4 book ai didi

objective-c - 托管对象上下文仅保存托管对象循环的最后一条记录

转载 作者:行者123 更新时间:2023-11-29 04:32:37 27 4
gpt4 key购买 nike

我正在使用 NSOperation 子类导入大量数据并像这样保存:

 - (void)main
{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSRunLoopCommonModes];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
[moc setUndoManager:nil]; //to make the import more effecient
NSError *error;

for (NSManagedObject *taskInfo in self.tasks) { //self.tasks are the xml returned from a web service

Task *taskDB = [NSEntityDescription insertNewObjectForEntityForName:@"Task"inManagedObjectContext:moc];
taskDB.taskID = [taskInfo valueForKey:@"TaskID"];
taskDB.taskAssignedDate = [taskInfo valueForKey:@"TaskAssignDate"];
taskDB.corporate = [self getCorporate:moc :[[taskInfo valueForKey:@"FacilityInfo"] valueForKey:@"ID"] ];
taskDB.dateTime = [[NSDate date]retain];
taskDB.requestNumber = [taskInfo valueForKey:@"RequestNumber"];


... //there are a lot of other properties for the task table
} //for
[moc save:&error];

[moc reset];
[pool drain], pool = nil;

}

但是managedObjectContext只保存循环中的最后一条记录,并不保存所有记录,但是,如果我将保存代码放在循环中,managementObjectContext将按预期保存所有记录。我还尝试通过在循环中设置一个计数器在 (10) 条记录后进行保存来在一定数量的记录后进行保存,但出现同样的问题,moc 在每 10 条循环后保存一条记录运行。我怎么解决这个问题 ?我希望 moc 一次或每运行 10 次循环保存所有记录

提前非常感谢。

最佳答案

您需要做的是将上下文合并到应用程序委托(delegate)中的上下文。首先注册NSManagedObjectContextDidSaveNotification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];

将其放置在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中的某个位置。

并添加这个方法:

- (void) contextChanged:(NSNotification *)notification {

if( [notification object] == [self managedObjectContext] ){
return;
}

if( ! [NSThread isMainThread] ){
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
return;
}

[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];

//You could save here:
NSError *error = nil;
if(! [[self managedObjectContext] save:&error] ) {
NSLog(@"Error saving context: %@", error);
}

}

现在会发生什么,当您从其他线程保存 ObjectContext 时,您的 appdelegate 将收到通知,对象上下文已被保存。接下来,您检查它是否不是您应用程序委托(delegate)中的某个上下文,然后确保您在主线程中运行并合并通知中的上下文。

<小时/>

其他人认为您的代码很奇怪:taskDB.dateTime = [[NSDate date]retain];。无需保留日期,酒店应为您复制或保留日期。

关于objective-c - 托管对象上下文仅保存托管对象循环的最后一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11520405/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com