gpt4 book ai didi

ios - 核心数据 - 如果在保存完成前删除应用程序崩溃

转载 作者:行者123 更新时间:2023-11-28 18:38:39 25 4
gpt4 key购买 nike

我的应用程序只需使用核心数据添加一些用户信息(姓名、生日、缩略图...)。

我注意到,如果我在创建用户后立即删除它,我的应用程序就会停止工作(不是崩溃,xCode 没有返回任何崩溃日志,什么也没有)。

我正在使用异步嵌套上下文来保存我的用户信息,所以我猜这种行为是由于我的 delete 语句在我的 save 语句之前执行的。

但由于我是 Core Data 的新手,我真的不知道如何处理它。我什至不知道我是否以正确的方式声明了嵌套上下文。

这是我的保存代码:

NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tmpContext.parentContext = self.backgroundManagedObjectContext;

BSStudent *newStudent = (BSStudent *)[NSEntityDescription insertNewObjectForEntityForName:kBSStudent inManagedObjectContext:tmpContext];

newStudent.firstname = firstname;
newStudent.lastname = lastname;
newStudent.birthdate = birthdate;
newStudent.thumbnail = thumbnail;
newStudent.createdAt = [NSDate date];

[self dismissViewControllerAnimated:YES completion:nil];

[tmpContext performBlock:^{
[tmpContext save:nil];

[self.backgroundManagedObjectContext performBlock:^{
NSError *error;
if (![self.backgroundManagedObjectContext save:&error]) {
NSLog(@"%@", [error localizedDescription]);
}

[self.managedObjectContext performBlock:^{
NSError *error;
if (![self.managedObjectContext save:&error]) {
NSLog(@"%@", [error localizedDescription]);
}
}];
}];
}];

为了精确起见,self.managedObjectContext 是一个 NSPrivateQueueConcurrencyTypeself.backgroundManagedObjectContext 是一个 NSMainQueueConcurrencyTypeself.backgroundManagedObjectself.managedObjectContext 的子项。

这是我的删除代码:

    BSStudent *student = objc_getAssociatedObject(alertView, kDeleteStudentAlertAssociatedKey);

// on supprimer l'objet et on sauvegarde le contexte
[self.managedObjectContext deleteObject:student];
NSError *error;
if(![self.managedObjectContext save:&error]) {
NSLog(@"%@", [error localizedDescription]);
}

有人知道如何正确处理这种情况吗?

最佳答案

您的删除可能正在使用由与您删除时不同的上下文创建的 BSStudent。下面的代码将解决这个问题。

NSManagedObjectContext * deleteContext = student.managedObjectContext;
[deleteContext deleteObject:student];

如果您真的想使用其他上下文,请使用 ObjectID 重新获取学生

NSManagedObject * studentToDelete = [self.managedObjectContext objectWithID:student.objectID];
[self.managedObjectContext deleteObject:studentToDelete];

嵌套上下文技巧

您的上下文可能没问题,但我看到很多人不必要地四处乱扔 performBlock。对于嵌套上下文,QueueConcurrencyType 指的是它将对其执行核心数据操作的线程,而不是创建它的线程。因此,在其 performBlock 中对自身进行保存之类的操作是不必要的,并且可能导致死锁。

当您保存子上下文时,父上下文会自动与更改同步。如果您想自动向上保存到下一个更高的父级,我建议为子级保存的 NSManagedObjectContextDidSaveNotification 注册父级。您可以让您的 AppDelegate 有一个用于创建子上下文的工厂方法,从而使这更容易。

- (NSManagedObjectContext *)createChildContext
{
NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tmpContext.parentContext = self.managedObjectContext;
//Register for NSManagedObjectContextDidSaveNotification
return tmpContext;
}

关于ios - 核心数据 - 如果在保存完成前删除应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543146/

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