gpt4 book ai didi

ios - "Core Data could not fulfill a fault"对于在主线程上的 appDelegate managedObjectContext 中创建的对象

转载 作者:行者123 更新时间:2023-11-29 10:52:02 27 4
gpt4 key购买 nike

我错误地在后台线程上创建了一组对象,这创建了一个新的 managedObjectContext,其中保存了这些对象。

这导致我的实时应用程序出现多次“核心数据无法完成故障”崩溃。请注意 - 我不是要删除这些对象 - 这是它们创建方式的问题,当我之后尝试在主线程的应用程序委托(delegate)(主)上下文中再次保存它们时。

令人困惑的是,我看到其他对象(不同类型的对象)出现此错误。它们可能与在后台线程中创建的对象有关,尽管它们本身不是在后台线程中创建的。

我很困惑这怎么会发生。对于不是在后台线程中创建的对象,而是在应用程序委托(delegate)(主)上下文中创建的对象,我如何获得“核心数据无法实现故障”错误?

有没有什么办法可以返回并修复我用户的实时应用程序中的这个错误?

让我引用我的另一个问题,通过它我发现了这个错误: "Core Data could not fulfill a fault" for objects that were not deleted

我写了一个新问题,因为我觉得这是一个不同的问题 - 尽管绝对相关。

这是在后台线程中创建对象的代码:

- (void)friendPickerViewControllerDidChooseFriends:(NSArray *)friends {

__ENTERING_METHOD__
if (friends.count > 0) {
[[FacebookHelper sharedManager] friendPickerController].navigationController.navigationBar.userInteractionEnabled = NO;


[self startProgressIndicator];
[self performSelectorInBackground:@selector(importFriends:) withObject:friends];
}
else {
[self dismissModalImportViewControllerAnimated];//releases picker delegates, etc
}
}



#pragma mark -
#pragma mark Import Friend
- (void)importFriends:(NSArray*)friends {

__ENTERING_METHOD__
for (NSDictionary<FBGraphUser> *friend in friends) {

[self importFriend:friend withCompletion:^(void){

CGFloat friendNumber = [friends indexOfObject:friend]+1;
CGFloat friendCount = friends.count;
self.importProgress = friendNumber/friendCount;
}];
}
}

- (void)importFriend:(NSDictionary<FBGraphUser>*)friend withCompletion:( void (^) (void) )completionBlock {

__ENTERING_METHOD__
Person *myNewPerson = [GetObjectArrayHelper createNewPersonMocSaveNew:YES];

myNewPerson.facebookID = friend.id;
myNewPerson.facebookName = friend.name;

NSString *nameFirst = [friend.first_name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *nameLast = [friend.last_name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];


NSString *imageID = friend.id;
UIImage *pickedImage = nil;
if(imageID){
pickedImage = [FacebookHelper imageForObject:imageID];
}

DLog(@"pickedImage:%@",pickedImage);

if(pickedImage){
[self setImagesForFacebookImage:pickedImage forPerson:myNewPerson];
}

//we should ALWAYS have a name
[Helper changePerson:myNewPerson firstName:nameFirst lastName:nameLast];

if(completionBlock) {
completionBlock();
}
}


- (void)finishedImporting {

__ENTERING_METHOD__
[SVProgressHUD showSuccessWithStatus:[self completeString]];
[self performSelector:@selector(dismissModalImportViewControllerAnimated) withObject:nil afterDelay:SV_PROGRESS_HUD_SUCCESS_DELAY];
}

- (void)dismissModalImportViewControllerAnimated {

__ENTERING_METHOD__

[Helper mocSave];//THIS SAVES IN THE APP DELEGATE MANAGED OBJECT CONTEXT -

[SVProgressHUD dismiss];

[self dismissViewControllerAnimated:YES completion:^(void){

[[FacebookHelper sharedManager] friendPickerController].delegate = nil;
[[FacebookHelper sharedManager] friendPickerController].navigationController.navigationBar.userInteractionEnabled = YES;
}];
}

请注意,我关心的对象不是此处创建的任何对象(或此处调用的方法中的对象),而是后来与这些对象相关联的对象。

为什么“核心数据无法完成故障”崩溃? (我理解为什么在这里创建的或在此处调用的方法中创建的任何对象都会得到它)。

另外 - 一旦我弄清楚为什么会发生这种困惑(并修复导致它的代码),我就需要修复用户实时应用程序中的恶意对象。我真的可以在这方面使用一些建议!

最佳答案

根据您的问题和评论,您是:

  • 在多个线程上使用单个托管对象。
  • 没有采取任何预防措施来处理 NSManagedObjectContext 不是线程安全的事实。

结果,您会遇到奇怪的、令人困惑的崩溃。

这正是人们在这种情况下所期望的。在不采取预防措施的情况下在多个线程上使用托管对象上下文本质上是导致崩溃和困惑的一种方法。这些崩溃可能没有多大意义,因为您正在破坏上下文的内部状态。

如果你想在多个线程上使用上下文,你必须使用队列限制选项之一(NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType ),然后您必须将所有使用上下文的代码或从中获取的任何对象放在 performBlock:performBlockAndWait: 中。 (异常(exception):如果你使用 NSMainQueueConcurrencyType 并且你知道你的代码在主线程上,你可以直接使用上下文)。您也可以通过类似 NSLock 的方式使用您自己的锁定机制,但是拜托,对于大多数人来说,线程已经够难了。

通常最好为每个线程使用一个上下文,作为父/子上下文或作为独立上下文,但上述方法也有效。

如果您确实因此设法保存了伪造的对象,唯一真正的办法是获取这些对象并修复它们或删除它们。如何识别这些对象取决于您的数据模型——没有针对“这个对象是垃圾吗?”的通用测试。任何检查都取决于您的应用认为什么是正确的。

关于ios - "Core Data could not fulfill a fault"对于在主线程上的 appDelegate managedObjectContext 中创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006689/

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