ske*_*ell 3 multithreading realm
我已阅读文档和理解,在很多情况下,你不需要手动调用refresh
的Realm
实例.但是,在这个非常常见的场景中,它被证明是必要的,因为完成块可能会在下一个运行循环开始之前查询Realm.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[RLMRealm defaultRealm] transactionWithBlock:^{
// Add some RLMObjects
}];
if (completion) {
dispatch_async(dispatch_get_main_queue(), ^{
[[RLMRealm defaultRealm] refresh]; // necessary if it queries realm
completion();
});
}
});
Run Code Online (Sandbox Code Playgroud)
我认为通过在后台线程上执行写操作我是一个好公民,但现在我必须打电话refresh
,我想知道这个调用所涉及的开销是否违背了后台处理的要点.
所以我的问题是:
1)什么是调用的性能开销refresh
上Realm
?
2)在这种模式中只向一个领域添加一个对象可能毫无意义.在这个模式中添加多少个对象后,我会看到一个优势,而不是只是同步在主线程上执行写入事务?
真的很棒的问题!
1)什么是调用的性能开销
refresh
上Realm
?
TL;博士; 清爽并不贵
成本将与Realm
在该线程上提升的实例所支持的实时"访问者"的数量成比例线性.Realm Objective-C中的访问器是RLMObject
s,RLMArray
s和RLMResult
s.
由于Realm使用了MVCC版本控制系统,类似于git的内部工作,调用-[RLMRealm refresh]
是将Realm的"当前事务指针"提升到最新的稳定状态,就像git pull
操作一样.
值得注意的是,对于具有runloop且autorefresh
设置为YES
(通常是主线程上的Realms的情况)的线程上的Realms,-[RLMRealm refresh]
将在runloop的每次迭代时自动调用.
因此,在绝大多数情况下,刷新领域将有一个可以忽略不计的性能影响,除非你有一个非常大的数量的上线直播"存取".
2)在这种模式中只向一个领域添加一个对象可能毫无意义.在这个模式中添加多少个对象后,我会看到一个优势,而不是只是同步在主线程上执行写入事务?
TL;博士; 在后台执行写入更安全
在绝大多数没有争用的情况下,在主线程上执行写事务的开销将低于平滑UI所需的1/60秒的阈值.然而,Realm中的写入是阻塞的,这意味着如果在后台同时发生大量写入事务,这将在同时从主线程写入时阻塞主线程,这不太理想,因为它会导致UI口吃或阻塞.
出于这个原因,我们建议所有写入事务,无论多小和多快,都要在后台线程上执行,除非您确定不会有任何争用.
我意识到在后台线程上执行写操作很复杂,因为Realm严格限制了访问器的线程限制,这就是我们跟踪为异步写入添加API的原因,允许在#3136中跨线程安全地切换访问器.
由于Realm中的读取操作不会被其他读取或写入阻止(感谢上面提到的MVCC!),因此在任何线程上执行这些操作都是完全可以接受的.
归档时间: |
|
查看次数: |
447 次 |
最近记录: |