删除单个对象会产生无效的更改通知

时间:2017-01-20 07:49:03

标签: objective-c realm

从Realm中删除对象时,我注意到通知中的奇怪事情。 删除单个对象时,有时更改包含2个删除和1个插入。如果你在表格中显示结果看起来都很好。但我在地图上显示结果,这个触发器不需要重新插入对象的动画......

我找到了两种解决问题的方法:

  • 手动过滤重新插入的对象
  • 按主键排序对象

使用primaryKey排序查询要慢得多吗?或者可能有更好的解决方案?

这是一些测试代码(Realm 2.3.0,Xcode 8.2.1):

@interface ModelA : RLMObject
@property int pk;
@end

@implementation ModelA
+ (NSString *) primaryKey
{
    return @"pk";
}
@end

@implementation ViewController
{
    RLMNotificationToken *_nfA;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    RLMRealm *realm = [RLMRealm defaultRealm];

    [realm beginWriteTransaction];
    for(int i = 0; i<10; ++i)
    {
        ModelA *a = [[ModelA alloc] init];
        a.pk = i;
        [realm addOrUpdateObject:a];
    }
    [realm commitWriteTransaction];

    _nfA = [[ModelA allObjects] addNotificationBlock:^(RLMResults *results, RLMCollectionChange *change, NSError *error)
    {
        if(change)
        {
            NSLog(@"Insertions: %lu deleteions:%lu modifications:%lu\n", change.insertions.count, change.deletions.count, change.modifications.count);
        }
    }];

    for(int i=0; i<10; ++i)
    {
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        [realm deleteObject:[[ModelA allObjects] objectAtIndex:0]];
        [realm commitWriteTransaction];
    }            
}
@end

输出:

2017-01-20 10:44:19.394 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.395 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.395 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.396 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.396 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.397 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.397 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.397 Test[7536:12871658] Insertions: 1 deleteions:2 modifications:0
2017-01-20 10:44:19.398 Test[7536:12871658] Insertions: 0 deleteions:1 modifications:0
2017-01-20 10:44:19.402 Test[7536:12871658] Insertions: 0 deleteions:1 modifications:0

如果使用以下内容替换请求行,则输出看起来很好:

_nfA = [[[ModelA allObjects] sortedResultsUsingKeyPath:@"pk" ascending:NO] addNotificationBlock:...

1 个答案:

答案 0 :(得分:1)

UITableView的插入/删除API非常挑剔,因为它很容易触发不一致异常。 Realm更改通知API旨在确保与UITableView / UICollectionView行为的紧密集成,这很可能就是为什么会发生这种情况。我假设它正在删除相邻的单元格,然后在交易中重新插入它。

没有办法覆盖Realm的行为。如果它确实是删除并重新插入相同的单元格,则应该可以以编程方式确定该行(通过比较它们的索引),然后忽略对其应用动画。

任何类型的排序本身都会比不排序慢。但是,由于您通过整数进行排序,因此它仍然比通过字符串排序更快。