[MagicalRecord saveWithBlock:completion:]
在完成块中显示NO成功并且错误为nil的条件是什么?
我看到的一个条件是保存块内的提取返回nil,因此没有保存。但我看到这里保存块中的提取返回一个有效的托管对象。
示例代码:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
TransactionQueueItem *item = [self queueItemForToken:token context:localContext];
if (nil == item)
NSLog(@"item is nil for token %@", token);
item.lastTryDate = [NSDate date];
if (nil != errorMsg)
item.lastTryError = errorMsg;
}
completion:^(BOOL success, NSError *error) {
if (!success)
{
NSLog(@"Error %@ updating last Try time item for token %@", error, token);
}
else
{
if (nil != completionBlock)
completionBlock();
}
}];
我看到该项目恢复正常,但随后在保存中我获得成功=否和错误=零,我没有看到发生了什么。
各种Google / Bing搜索并未指出结论性结论。感谢。
答案 0 :(得分:3)
我遇到了同样的误解,但似乎success
只是意味着它没有保存数据,而不是发生错误。如果没有要保存的数据,它将无法返回成功,但您的数据仍然存在。
这是我在success
到NO
和error
到nil
之后获得的日志输出:
-08-01 14:07:01.003 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dbac50) → Saving <NSManagedObjectContext (0x8dbac50): *** UNNAMED ***> on *** BACKGROUND THREAD ***
2014-08-01 14:07:01.003 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dbac50) → Save Parents? 1
2014-08-01 14:07:01.004 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dbac50) → Save Synchronously? 0
2014-08-01 14:07:01.004 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8db99c0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING
在NSManagedObjectContext+MagicalSave.m:41
文件中,您会看到它检查当前上下文中的更改,但如果没有新数据则不会保存它:
if (![self hasChanges]) {
MRLog(@"NO CHANGES IN ** %@ ** CONTEXT - NOT SAVING", [self MR_workingName]);
if (completion)
{
dispatch_async(dispatch_get_main_queue(), ^{
completion(NO, nil);
});
}
return;
}
答案 1 :(得分:0)
success参数是对localContext调用save:的结果。也就是说,MagicalRecord会为您执行一些基本的错误处理和其他日志记录,并包装save:方法。除了MagicalRecord已为您做的事情之外,我们还会在此回调中为您返回该值,以便您自己处理任何问题。