gpt4 book ai didi

ios - 即使在 ARC 下,在 GCD 中使用 Realm 时,我们是否必须使用显式自动释放池

转载 作者:行者123 更新时间:2023-12-04 18:33:46 26 4
gpt4 key购买 nike

Realm 的文档中说:

您在使用 Grand Central Dispatch 访问 Realm 时也可能会遇到此问题。当 Realm 最终进入调度队列的自动释放池时,就会发生这种情况,因为这些池可能在执行代码后的一段时间内不会被清空。在释放 RLMRealm 对象之前,无法重用 Realm 文件中数据的中间版本。 为避免此问题,您应该在从调度队列访问 Realm 时使用显式自动释放池。

这是否意味着即使在 ARC 下,我们也必须在 GCD 中每次都使用显式自动释放池?有人可以发布代码示例吗?这个有点重要,但是官方文档并没有那么强调

最佳答案

您真的不必每次都使用显式自动释放池。它更适用于您执行大量并发事务并且很容易遇到跟踪许多即时版本的风险的场景。或者,当您想通过释放所有打开的访问器来确保在应用程序的生命周期内关闭 Realm 文件时。

在这一点上,文档更多地被理解为了解技术限制,并提示一旦遇到此类问题如何解决,而不是一般的最佳实践。当然,你总是可以这样做,而且它不一定会伤害你(就像“如果你有一把锤子,一切看起来都像钉子。”),但你不一定非得这样做。

并不是每个人都需要这个额外的复杂性。了解显式自动释放池需要更深入地了解 ARC,这不是一般要求。如果您有想法,以及如何以更好的方式解决这个问题,我们非常欢迎您提供反馈。

本节Using a Realm Across Threads举个例子,在后台队列中插入一百万个对象:

dispatch_async(queue) {
autoreleasepool {
// Get realm and table instances for this thread
let realm = try! Realm()

// Break up the writing blocks into smaller portions
// by starting a new transaction
for idx1 in 0..<1000 {
realm.beginWrite()

// Add row via dictionary. Property order is ignored.
for idx2 in 0..<1000 {
realm.create(Person.self, value: [
"name": "\(idx1)",
"birthdate": NSDate(timeIntervalSince1970: NSTimeInterval(idx2))
])
}

// Commit the write transaction
// to make this data available to other threads
try! realm.commitWrite()
}
}
}

通常在单独的自动释放池中创建多个对象是有意义的,因为您无法使用 ARC 真正预测对象释放何时发生,因此您有一个明确的时间点,它们最晚发生的时间,这让您的程序更确定性地理解您和其他人。

关于ios - 即使在 ARC 下,在 GCD 中使用 Realm 时,我们是否必须使用显式自动释放池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34084108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com