iOS:成功条件为NO,错误为[MagicalRecord saveWithBlock:completion:]为零

时间:2014-04-30 20:53:57

标签: ios magicalrecord

[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搜索并未指出结论性结论。感谢。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的误解,但似乎success只是意味着它没有保存数据,而不是发生错误。如果没有要保存的数据,它将无法返回成功,但您的数据仍然存在。

这是我在successNOerrornil之后获得的日志输出:

-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已为您做的事情之外,我们还会在此回调中为您返回该值,以便您自己处理任何问题。