从错误的线程Swift访问的领域

时间:2017-10-05 10:39:36

标签: ios swift multithreading thread-safety realm

使用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访问的域”的异常。我已经阅读了一些类似的问题,但仍然不清楚,所以请任何人都可以帮我澄清这个问题,我应该如何修复我的代码。非常感谢

2 个答案:

答案 0 :(得分:3)

正如@EpicPandaForce在他的评论中所说,你只能在你创建的同一个线程上访问你的Realm对象。

看起来你正试图从后台线程访问你的Realm但是如果你在主线程上创建了它,那么你需要发回它。

DispatchQueue.main {
  self.product.saveToLocal()
}

答案 1 :(得分:2)

我不熟悉Realm,但似乎你可能不得不从主线程中调用它?尝试打印出日志中的当前线程(Thread.current),看看你是否在后台运行。

如果是这样的情况,请在DispatchQueue.main.async(执行:{})中包装您的执行/添加调用,以查看是否可以解决问题?