从不正确的线程访问的领域 - 调度异步
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!)
// …
【讨论】:
以上是关于从不正确的线程访问的领域 - 调度异步的主要内容,如果未能解决你的问题,请参考以下文章
在 IntentService 和 AsyncTask (Android) 之间使用共享代码时,领域“从不正确的线程访问”错误