从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:...
答案 0 :(得分:1)
UITableView
的插入/删除API非常挑剔,因为它很容易触发不一致异常。 Realm更改通知API旨在确保与UITableView
/ UICollectionView
行为的紧密集成,这很可能就是为什么会发生这种情况。我假设它正在删除相邻的单元格,然后在交易中重新插入它。
没有办法覆盖Realm的行为。如果它确实是删除并重新插入相同的单元格,则应该可以以编程方式确定该行(通过比较它们的索引),然后忽略对其应用动画。
任何类型的排序本身都会比不排序慢。但是,由于您通过整数进行排序,因此它仍然比通过字符串排序更快。