swift - 使用非托管对象从不正确的线程访问领域
问题描述
领域文档说 T(value: Any) 创建了一个非托管对象,并且这些对象没有在不同线程中处理的问题,这是怎么回事?
func getOne<T : Object>(type : T.Type) -> Promise<T> {
return Promise { seal in
self.operatingQueue.async {
autoreleasepool {
if let realm = self.openRealm() {
let results = realm.objects(T.self)
if let first = results.first {
let unmanaged : T = T(value: first, schema : .partialPrivateShared())
seal.fulfill(unmanaged)
}
} else {
seal.reject(PersistanceError.couldNotOpenDatabase)
}
}
}
}
}
此代码崩溃:
2019-11-13 20:08:51.259420-0500 CommonStock[6395:131786] *** Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff23baa1ee _exceptionPreprocess + 350
1 libobjc.A.dylib 0x00007fff50864b20 objc_exception_throw + 48
2 Realm 0x000000010b69e11b ZN12_GLOBAL__N_114translateErrorIZ13RLMDynamicGetE3$5EEDaOT + 155
3 Realm 0x000000010b69dfdc RLMDynamicGet + 284
4 Realm 0x000000010b69e57d RLMDynamicGetByName + 1053
5 RealmSwift 0x000000010d6c2f44 $s10RealmSwift6ObjectCyypSgSScig + 708
6 RealmSwift 0x000000010d6c2b82 $s10RealmSwift6ObjectCyypSgSScigTo + 98
7 Realm 0x000000010b71ad1a -[RLMObjectBase descriptionWithMaxDepth:] + 714
8 Realm 0x000000010b6d4f7d RLMDescriptionWithMaxDepth + 1101
9 RealmSwift 0x000000010d6b4a27 $s10RealmSwift8ListBaseC23descriptionWithMaxDepth33_027551CC6B6B2DBBB6CF4A740CB6E5D6LLySSSuF + 247
10 RealmSwift 0x000000010d6b4bd0 $s10RealmSwift8ListBaseC23descriptionWithMaxDepth33_027551CC6B6B2DBBB6CF4A740CB6E5D6LLySSSuFTo + 48
11 Realm 0x000000010b71adc5 -[RLMObjectBase descriptionWithMaxDepth:] + 885
解决方案
该错误不是在抱怨您的对象;它对您的投诉Realm
。代码self.openRealm()
实际上做了什么,为什么这是一个实例方法?您是否尝试将其替换为常规let realm = try? Realm()
. 您可以从另一个线程访问一个领域,但您需要为该线程实例化一个领域对象;您不能在与创建线程不同的线程上使用相同的 Realm 实例。我猜你是在一个线程上创建和持久化,Realm
然后尝试在另一个线程上使用它。
推荐阅读
- python - 在 Django 中安排文件下载
- flutter - Flutter 自定义画家剪影
- c# - 如何为 Unity 3D 修复此脚本
- javascript - 为什么一个简单的 React 组件会渲染两次?
- excel - Excel有没有办法选择一个类别中最大的两个项目,然后减去它们?
- c# - WPF 中用于导出包含许多项目的 ListBox 控件内容的解决方案
- r - dplyr 均值问题(参数不是数字或逻辑:返回 NA)
- python - python ThreadPoolExecutor 在我得到结果时关闭所有线程
- android - 我刚刚安装了 Flutter、Android Studio 和 VS CODE,但我无法让 Flutter Doctor 消除以下错误-
- javascript - 如何在获取输出信息时使 Zapier 代码步骤失败