Ios 具有后台进程的领域实例丢失数据

Ios 具有后台进程的领域实例丢失数据,ios,swift,realm,Ios,Swift,Realm,我使用仅内存配置的Swift领域。由于在后台线程中更新数据库,我每次使用它时都会创建一个领域实例。这一点在第二节中提到,这里还有另一个问题 但是通过测试数据库,我发现了一种不可预测的行为。有时数据库是空的,更新会重新填充数据库而不是更新。原因可能是在编写之后,该领域被解除分配 解决方案可能是在主线程中保留一个强引用。我将领域配置保存在单例中。singleton返回一个配置相同的新领域进行更新,并保留对另一个领域的强引用以防止丢失,这样安全吗?听起来应该可以正常工作。你必须尝试一下,这可能比在这里

我使用仅内存配置的Swift领域。由于在后台线程中更新数据库,我每次使用它时都会创建一个领域实例。这一点在第二节中提到,这里还有另一个问题

但是通过测试数据库,我发现了一种不可预测的行为。有时数据库是空的,更新会重新填充数据库而不是更新。原因可能是在编写之后,该领域被解除分配


解决方案可能是在主线程中保留一个强引用。我将领域配置保存在单例中。singleton返回一个配置相同的新领域进行更新,并保留对另一个领域的强引用以防止丢失,这样安全吗?

听起来应该可以正常工作。你必须尝试一下,这可能比在这里等待一个明确的答案要快

我将编写一个单例类,作为构造函数的一部分,它定义并存储领域配置,还打开并存储该领域的实例。然后我会向该类添加一个访问器,供线程使用;它将使用相同的配置返回域的新实例。当这些超出范围(您应该允许它们超出范围)时,由于singleton实例维护其引用,您的领域将持续存在


我可能错误地阅读了您的第一个引用问题,但这不是内存领域的问题,因此不要求您在某个地方保留引用。

在本期中,我们将讨论主线程上的单例提示。我的解决方法是在某个线程的config singleton中保存一个强引用。所有的工作都是在一个新的领域里完成的。所以我一点也没有把线程弄混——我希望如此。也许我应该在主线程上使用dispatch创建我的singleton。并且仅当调用方来自另一个线程时才创建新域!?虽然我理解这个问题,但用例并不清楚。在某些情况下,单例模式可能是一种解决方案,但正如David在回答中提到的,以线程安全的方式使用领域的最佳方法是使用let Realm=try创建对领域的新引用!Realm()每次在线程之间移动时。如果您遇到意外的结果,问题可能出在其他地方。添加一些演示此问题的代码可能会有所帮助。请花点时间复习一下谢谢Jay。每次使用新领域实例时,我都会遇到这个问题。这似乎很有效。但是在测试数据库时,从后台线程写入并单步执行调试器后,它是空的。因此,可能必须对具有相同配置的领域进行强引用。现在它似乎起作用了。是的,我试过了,它似乎起作用了。希望在后台线程中写入一个新的领域,并在之后销毁不会导致任何问题。