我有一个应用程序可以对一个领域进行大量后台读取,在此期间,另一个后台线程(即不是主线程)可能正在写入同一个领域,因此我在后台线程上使用一个自动释放池,以确保快速恢复对领域的线程引用。见下文摘录
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 {
....
}
}
通过阅读文档跨线程使用领域和inWriteTransaction,还不清楚在commitWrite()
和/或离开自动发布池之前,对backgroundRealm.invalidate()
的调用是否有助于降低文件大小并提高性能?当这个领域在幕后被收回时,这是否隐含地发生了?对invalidate()
的调用只会浪费CPU周期而不会带来额外的好处吗?
发布于 2016-07-25 08:05:11
调用
backgroundRealm.invalidate()
是否有助于降低文件大小并提高性能?
不是的。invalidate()
对文件大小没有影响。如果要将文件大小保持在较小的范围内,则需要使用writeCopyToURL(_:, encryptionKey:_, error: _)
编写压缩副本。但是,没有方便的方法用于就地契约,这将需要使所有访问线程无效。
当这个领域在幕后被收回时,这是否隐含地发生了?
就没必要了。当不再有任何访问器来阻止它时,一个领域就会被释放。因此,没有任何东西可以被废除。
调用使()失效只会浪费CPU周期,而不会带来额外的好处吗?
只要您不从您的自动发布池中泄漏访问器,您就应该没事。如果您在运行时泄漏对象来定位这些对象,调用invalidate()
可能会有所帮助。但是要小心:当您访问一个无效的对象时,它将失败。
https://stackoverflow.com/questions/38558775
复制相似问题