如果使用autoreleasepool来控制对域的引用,最好在离开池之前调用realm.invalidate

时间:2016-07-25 02:09:04

标签: ios swift realm

我有一个应用程序,它做了很多背景阅读领域,在此期间,另一个后台线程(即不是主线程)可能正在写入同一个域,所以我在后台线程上使用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 threadsinWriteTransaction,不清楚在commitWrite()之后和/或在离开自动释放池之前,是否会有backgroundRealm.invalidate()的呼叫帮助保持文件大小下降并提高性能?这个领域在幕后被收回时会隐含发生吗?调用invalidate()只会浪费CPU周期而不会产生额外的好处吗?

1 个答案:

答案 0 :(得分:1)

  

调用backgroundRealm.invalidate()是否有助于缩小文件大小并提高性能?

没有。 invalidate()对文件大小没有影响。如果要保持文件大小不变,则需要使用writeCopyToURL(_:, encryptionKey:_, error: _)来编写压缩副本。但对于就地压缩没有便利方法,这需要使线程中的所有访问器无效。

  

在幕后回填领域时会隐式发生这种情况吗?

没有必要。一个王国被解除分配,当没有任何继承者留下来再停止它。所以没有什么可以失效的。

  

对invalidate()的调用是否只会浪费CPU周期而不提供额外的好处?

只要您不从自动释放池中泄漏访问者,就应该没问题。如果泄漏对象以便稍后在运行时找到它们,则调用invalidate()可能会有所帮助。但请注意:当您访问无效对象时,它将失败。