使用Realm保存从QRCode检索到的数据,如下所示:
self.barcodesHandler = { barcodes in
if !self.dispatched {
self.dispatched = true
for barcode in barcodes {
print("Barcode found: type=" + barcode.type + " value=" + barcode.stringValue)
let barcodeStringArray = barcode.stringValue.components(separatedBy: ": ")
let infoVC = ANSProductDetailViewController()
self.product = ANSProductModel(name: barcodeStringArray[1], manufacturer: barcodeStringArray[2], registerLocation: barcodeStringArray[0], detailUrl: barcodeStringArray[3])
infoVC.product = self.product
DispatchQueue.main.async(execute: {
infoVC.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(infoVC, animated: true)
})
break
}
self.product.saveToLocal()
}
}
//ANSProductModel save method, self = ANSProductModel
func saveToLocal() {
Realm.execute { (realm) in
realm.add(self, update: true)
print("Product saved")
}
}
然而,在打印日志之后,它抛出了一个名为“从错误的线程Swift访问的域”的异常。我已经阅读了一些类似的问题,但仍然不清楚,所以请任何人都可以帮我澄清这个问题,我应该如何修复我的代码。非常感谢
答案 0 :(得分:3)
正如@EpicPandaForce在他的评论中所说,你只能在你创建的同一个线程上访问你的Realm对象。
看起来你正试图从后台线程访问你的Realm但是如果你在主线程上创建了它,那么你需要发回它。
DispatchQueue.main {
self.product.saveToLocal()
}
答案 1 :(得分:2)
我不熟悉Realm,但似乎你可能不得不从主线程中调用它?尝试打印出日志中的当前线程(Thread.current),看看你是否在后台运行。
如果是这样的情况,请在DispatchQueue.main.async(执行:{})中包装您的执行/添加调用,以查看是否可以解决问题?