在下次App运行时从错误的线程访问域

时间:2017-07-10 04:55:58

标签: swift3 realm

所以我们有一个用户需要登录的应用程序。在登录期间,数据从Internet下载并创建到Realm数据库中。

如果应用程序已关闭并重新打开,我们希望应用程序保留已登录的用户,这样他们就不需要再次重新登录。在第一次用户登录时,一切都很好并且没问题。当应用程序关闭并重新打开时,Realm数据库会抛出错误“从错误的线程中访问”...

我无法提供太多代码,因为我不知道问题出在哪里。我想知道是否再次重新运行应用程序是否与以前不同?如果是,那么如何在新线程中访问从先前线程创建的数据而不会遇到所述错误?

任何帮助将不胜感激...提前致谢

1 个答案:

答案 0 :(得分:2)

正如您所遇到的那样,您无法从与其打开的线程不同的线程访问域。但是,可以在不同的线程上打开同一域的多个实例(如果需要,则可以打开相同的线程)。打开领域并不是一项昂贵的操作,因此在开放领域没有性能问题。

我猜你的情况是你在后台线程上下载数据。我也猜测领域是在该网络请求的回调中首次打开的。这意味着领域在回调打开的线程上打开。如果您在重新打开应用程序(或任何其他与以前不同的线程的线程)时尝试在主线程上访问该域,则会出现错误。

最佳做法是每次知道自己在不同的线程上工作时都要打开一个新领域。正如我所提到的,这不是一项昂贵的操作,应该大量使用。

如果您有某种RealmServiceRealmManager作为单身人士,我建议不要这样做。如果领域在主线程上初始化,您将无法从后台线程向其添加记录。

简而言之:每当你在回调中对一个领域进行操作时,除非你100%肯定你将与你打开一个领域在同一个线程上,创建一个新的领域实例并使用它来做你的操作。