这是文档关于使用GCD访问领域的说法:
"从调度队列访问Realm时,应使用显式自动释放池。"
我在我的应用中使用过这种做法,但我突然在控制台中看到以下消息: " RLMRealm实例在写入事务期间被解除分配"。
它不会抛出错误,它只是默默地将其打印到控制台。没有任何内容写入数据库。
我在github上发现这个问题似乎很相似。
我的问题是:我应该使用什么做法?在Realm文档中使用的那个或在github问题中找到的答案?
感谢您的任何澄清。
答案 0 :(得分:10)
GCD块管理自己的@autorelease
池,但不能保证何时实际发生,并且在块本身完成后可能会发生相当长的时间(见SO answer)< / p>
Realm跨线程维护其所有实例的读锁(这是在另一个线程上打开写事务时仍然可以从Realm读取的),因此,建议显式释放Realm实例当你完成后,可以回收磁盘空间。
如果你不使用@autoreleasepool
,就不会发生太糟糕的事情;只是磁盘上Realm文件的大小会增加。
最佳做法是使用@autoreleasepool
块,并确保在该块内提交所有写入事务。
@autoreleasepool {
let realm = try! Realm()
try! realm.write {
// ... perform changes
}
}
通常建议realm.write
使用beginWrite()
/ commitWrite()
,因为它可以让您安全地执行事务而不会忘记提交,还提供了一些额外的错误处理。
GitHub上的问题是,有一个逻辑路径会导致@autoreleasepool
在写入事务提交之前退出。在这种情况下,您需要检查代码逻辑并确保没有类似的东西。