尝试在块中保存对象时崩溃。 (CoreData 无法满足...的错误)

Posted

技术标签:

【中文标题】尝试在块中保存对象时崩溃。 (CoreData 无法满足...的错误)【英文标题】:Crash when try to save an object inside a block. (CoreData could not fulfill a fault for...) 【发布时间】:2015-08-13 19:53:12 【问题描述】:

我试图在 AFNetworking 块中保存一个对象,但有时它会崩溃并出现错误:CoreData could not fulfill a fault for...

当我尝试管理从持久存储中删除的对象数据时,我已经读到它是相关的。

(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html)

我怎样才能避免这种情况?


例子:

Line *line = [Line MR_createEntity];
[line setSync:@(SYNC_PROCESSING)];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://test.com/request" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 

    // CRASH
    [line setSync:@(SYNC_SUCCESS)];
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

 failure:nil];

【问题讨论】:

尝试使用 MR_saveToPersistentStoreWithCompletion 并告诉我它对您有帮助吗? 【参考方案1】:

您正在尝试执行后台操作。 defaultContext 仅用于主线程(没有明确记录,我们正在努力)。但是您要做的是在将为您处理后台线程操作的上下文中执行保存。也就是说,您想使用在后台工作的 NSManagedObjectContext。一般试试这个:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 

    id myObject = [line MR_inContext:localContext];
    [myObject setSync:@(value)];
];

这将使 MagicalRecord 在尝试保存数据时为您的数据创建适当的背景上下文以进行操作。 MagicalRecord 将设置开始使用 Core Data 所需的大部分内容。让它完成大部分工作,您就可以上路了。

【讨论】:

@casadermora 感谢您的帮助!当它不在块上时,我应该继续使用[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 吗? 您只在主线程上使用默认上下文。否则,使用这个块,或者创建一个新的上下文并在那里执行你的工作。

以上是关于尝试在块中保存对象时崩溃。 (CoreData 无法满足...的错误)的主要内容,如果未能解决你的问题,请参考以下文章

在块中返回非指针对象时出现问题

如何在保存时调试 CoreData 崩溃?

在块中修改后未更新 Swift 结构

保存期间CoreData比较错误

我使用 coreData 保存数据,但对象保持为零

在块中复制和自动释放本地变量