从不正确的线程访问的领域 - 调度异步

Posted

技术标签:

【中文标题】从不正确的线程访问的领域 - 调度异步【英文标题】:Realm accessed from incorrect thread - dispatch async 【发布时间】:2016-03-19 20:56:13 【问题描述】:

我正在尝试在不同的线程上进行一些排序,但是我不断收到Realm accessed from incorrect thread。以下是我目前尝试过的。

        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) 
            // do some task
            self.organizationArray = GetOrganization.sortOrganizationsByDistanceFromLocation(realm.objects(Organization), location: self.lastLocation!)
            dispatch_async(dispatch_get_main_queue()) 
                self.lastLoadedPage = self.lastLoadedPage + 1

                if numberOfResults < self.limit 
                    //Hide FooterView
                    self.moreDataAvailable = false
                    self.hideTableViewFooter()

                
            
        

【问题讨论】:

当 Realm 的对象之一从创建它的线程之外的线程访问时,会引发 Realm accessed from incorrect thread 异常。您可以在 Xcode 中添加 breakpoint on Objective-C exceptions 以确定发生这种情况的应用程序的位置。在您发布的代码 sn-p 中没有明显的这种性质的问题,因此问题必须存在于您的应用程序的其他地方,或者存在于您从帖子中省略的某些代码中。 【参考方案1】:

假设您从主线程调用显示的代码 sn-p,例如从视图控制器看来,您很可能在另一个线程上使用主线程中的 RLMRealm 实例。

 let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) 
            // Get a Realm for the current thread
            RLMRealm *realm = [RLMRealm defaultRealm];

            // do some task with that instance instead
            self.organizationArray = GetOrganization.sortOrganizationsByDistanceFromLocation(realm.objects(Organization), location: self.lastLocation!)
            // …

【讨论】:

以上是关于从不正确的线程访问的领域 - 调度异步的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 表单 - 从不正确的线程访问的领域

在 IntentService 和 AsyncTask (Android) 之间使用共享代码时,领域“从不正确的线程访问”错误

线程间操作无效: 从不是创建控件“button1”的线程访问它。

了解 dispatch_queues 和同步/异步调度

初探多线程

使用 rxjava 和 dagger2 跨线程访问领域