ios - 在自动释放池中使用 Realm 的正确方法是什么?

标签 ios swift realm autorelease

这是文档中关于使用 GCD 访问 Realm 的内容:

“当从调度队列访问 Realm 时,您应该使用显式自动释放池。”

Documentation

我在我的应用程序中使用了这种做法,但我突然在我的控制台中看到以下消息: “RLMRealm 实例在写入事务期间被释放”。

它并没有抛出错误,只是静静地将错误打印到控制台。没有任何内容写入数据库。

我在 github 上发现了这个问题这看起来非常相似。

我现在的问题是:我应该使用什么练习?是在 Realm 文档中使用的还是在 github 问题中找到的答案?

感谢任何澄清。

最佳答案

GCD block 管理它们自己的@autorelease 池,但不能保证实际发生的时间,它可能会在 block 本身完成后的相当长一段时间内发生(参见 SO answer )

Realm 跨线程维护其所有实例的读锁(这就是在另一个线程上打开写事务时仍然可以从 Realm 读取的原因),因此,建议显式释放 Realm 实例完成后可以回收磁盘空间。

如果您不使用@autoreleasepool,则不会发生什么太糟糕的事情;只是磁盘上的 Realm 文件的大小会增加。

最佳实践是使用 @autoreleasepool block ,并确保所有写入事务都在该 block 内提交。

@autoreleasepool {
    let realm = try! Realm()
    try! realm.write {
        // ... perform changes
    }
}

通常建议使用 realm.write 而不是 beginWrite()/commitWrite() 因为它可以让您安全地执行事务而不会忘记提交,并且还提供了一些额外的错误处理。

GitHub 上的问题是有一个逻辑路径会导致 @autoreleasepool 在写入事务提交之前退出。在这种情况下,您需要检查您的代码逻辑并确保您没有任何类似的东西。

关于ios - 在自动释放池中使用 Realm 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219120/

相关文章:

ios - 如何检查 swift 2.2 中是否存在 iphone 控制中心?

android - Realm 惰性查询 - 它们比 OrmLite 更快吗?

ios - UIview.hidden 不会消失,而是隐藏在另一个 View 后面

ios - 创建 NSManagedObject 的子类

objective-c - NSLog中的前缀是什么意思?

iphone - kal 日历集成

swift - 将 SwiftLint 作为依赖项添加到 Podspec 项目

ios - 不快速读取字符串中的特殊字符

ios - Realm Swift 多用户登录

react-native - Realm : delete specific object