ios - 为什么 NSManagedObjectContextObjectsDidChangeNotification 在回滚后用删除的对象调用两次?

标签 ios objective-c macos core-data rollback

我对 NSManagedObjectContextObjectsDidChangeNotification 有一个问题,在插入一个对象然后执行回滚(因此它被删除)之后,关于删除的更改通知被调用两次。这个意外的通知给我带来了麻烦,我已经追溯到这个问题。我编辑了 Apple's Earthquakes example来证明这个问题。编辑是:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self reloadTableView:self];
    
    [NSNotificationCenter.defaultCenter
     addObserver:self
     selector:@selector(contextObjectsDidChangeNotification:)
     name:NSManagedObjectContextObjectsDidChangeNotification
     object:self.managedObjectContext];
    
    AAPLQuake* quake = (AAPLQuake *)[NSEntityDescription insertNewObjectForEntityForName:@"Quake" inManagedObjectContext:self.managedObjectContext];
    
    NSLog(@"Why is deleted notified twice?");
    [self.managedObjectContext rollback];
}

- (void)contextObjectsDidChangeNotification:(NSNotification *)notify{
    NSLog(@"contextObjectsDidChangeNotification:");
    NSDictionary* userInfo = notify.userInfo;
    NSSet* inserted = userInfo[NSInsertedObjectsKey];
    if(inserted){
        NSLog(@"\tinserted %ld", inserted.count);
    }
    NSSet *deleted = userInfo[NSDeletedObjectsKey];
    if(deleted){
        NSLog(@"\tdeleted %ld", deleted.count);
    }
}

运行结果如下:

2015-12-23 00:15:20.086 Earthquakes[7631:5431685] Why is deleted called twice?
2015-12-23 00:15:20.086 Earthquakes[7631:5431685] contextObjectsDidChangeNotification:
2015-12-23 00:15:20.086 Earthquakes[7631:5431685]   inserted 1
2015-12-23 00:15:20.086 Earthquakes[7631:5431685] contextObjectsDidChangeNotification:
2015-12-23 00:15:20.087 Earthquakes[7631:5431685]   deleted 1
2015-12-23 00:15:20.087 Earthquakes[7631:5431685] contextObjectsDidChangeNotification:
2015-12-23 00:15:20.087 Earthquakes[7631:5431685]   deleted 1

可用的示例项目 here .

有人知道为什么会这样吗?我在 OS X 10.11.2 和 iOS 9.2 上都体验过。

最佳答案

我看到了同样的行为,但我不知道为什么会这样。但是,您似乎可以通过查看托管对象的 hasChanges 属性来区分第一次调用和第二次调用。在第一次调用时,hasChanges 为 YES,在第二次调用时为 NO。至少,这应该足以避免自己处理两次删除。

相同的更改发生在对象的 deleted 属性上,因此最好同时检查两者。

关于ios - 为什么 NSManagedObjectContextObjectsDidChangeNotification 在回滚后用删除的对象调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426719/

相关文章:

ios - WebRTC + IOS + Freeswitch : Can't hear audio

ios - 如何在可见之前开始滚动 UIPickerView?

ios - 从函数更改 uicollectionViewCell 上的图像

ios - 在 UITextView 中检测字典键

Objective-C 修改可变容器中的元素

ios - 我可以将 (unsigned) 更改为 (NSUInteger) 还是会产生问题?

ios - Objective C 为不重复的对象生成随机 ID

python - OSX 如何在使用 C++ 扩展 python 时调试 malloc 错误?

Android Studio 在 macOS 上启动失败并出现错误 "Cannot Lock System Folders"

javascript - 在 Swift 中返回 JavaScript 值