【发布时间】:2017-08-19 15:03:46
【问题描述】:
我有一个名为Trip 的领域对象。它存储用户移动的数据。
class Trip: Object {
dynamic var id: Int = 0
dynamic var startTimestamp: Int64 = 0
dynamic var endTimestamp: Int64 = 0
dynamic var distance: Double = 0.0
dynamic var calories: Double = 0.0
dynamic var averageSpeed: Double = 0.0
}
在视图控制器中,我保留了一个名为 trip 的类级变量。
fileprivate var trip: Trip?
每当用户开始旅行时,我都会初始化一个Trip 对象并将其分配给该变量。
trip = Trip()
在用户的移动过程中,我不断用数据更新这个trip 对象。
我需要每 1 分钟将这些数据保存到 Realm 数据库中。所以我运行了一个计时器。
Timer.scheduledTimer(timeInterval: 60, target: self, selector: #selector(save()), userInfo: nil, repeats: true)
它执行一个函数将这个对象保存在后台线程中。
fileprivate func save() {
do {
DispatchQueue(label: "RealmBackgroundThread").async {
autoreleasepool {
let realm = try! Realm()
try! realm.write {
realm.add(self.trip!, update: true)
}
}
}
} catch {
}
}
到这里为止,一切正常。问题是在第一次保存后,当我再次尝试访问该trip 对象时,它会崩溃并出现以下错误。
libc++abi.dylib: 以未捕获的领域类型异常终止::IncorrectThreadException: 领域从不正确的线程访问。
我认为这是因为我打开了一个新的Realm 以将此对象保存在后台线程中。我知道 Realm 不是线程安全的。
但我不确定如何解决这个问题。保存后如何继续使用相同的trip 对象?
【问题讨论】:
-
你读过这个帖子stackoverflow.com/questions/37123936/… 吗?
标签: ios swift multithreading realm