我有一个应用程序,它做了很多背景阅读领域,在此期间,另一个后台线程(即不是主线程)可能正在写入同一个域,所以我在后台线程上使用autoreleasepool确保快速回收对域的线程引用。见下面的摘录
autoreleasepool {
do {
let backgroundRealm = try Realm(configuration: self.configuration)
.... Do lots of reading
backgroundRealm.beginWrite()
.... Do lots of writing here
try backgroundRealm.commitWrite()
// Is this good practice or not?
backgroundRealm.invalidate()
}
catch {
....
}
}
通过阅读文档Using a realm across threads和inWriteTransaction,不清楚在commitWrite()
之后和/或在离开自动释放池之前,是否会有backgroundRealm.invalidate()
的呼叫帮助保持文件大小下降并提高性能?这个领域在幕后被收回时会隐含发生吗?调用invalidate()
只会浪费CPU周期而不会产生额外的好处吗?
答案 0 :(得分:1)
调用
backgroundRealm.invalidate()
是否有助于缩小文件大小并提高性能?
没有。 invalidate()
对文件大小没有影响。如果要保持文件大小不变,则需要使用writeCopyToURL(_:, encryptionKey:_, error: _)
来编写压缩副本。但对于就地压缩没有便利方法,这需要使线程中的所有访问器无效。
在幕后回填领域时会隐式发生这种情况吗?
没有必要。一个王国被解除分配,当没有任何继承者留下来再停止它。所以没有什么可以失效的。
对invalidate()的调用是否只会浪费CPU周期而不提供额外的好处?
只要您不从自动释放池中泄漏访问者,就应该没问题。如果泄漏对象以便稍后在运行时找到它们,则调用invalidate()
可能会有所帮助。但请注意:当您访问无效对象时,它将失败。