2017-10-05 18 views
0

即时访问:领域使用领域,以节省检索从QR码下面的数据不正确的线程斯威夫特

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") 
} 
} 

然而,打印日志后,把它扔到了所谓的“境界不正确的线程斯威夫特访问”异常。我已经阅读了一些类似的问题,但仍然不清楚,所以请任何人都可以帮助我澄清这个问题,以及如何修复我的代码。非常感谢

回答

1

我对Realm不熟悉,但看起来您可能需要从主线程调用它。尝试打印出日志中的当前线程(Thread.current)以查看您是否在背景上。

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

+1

您需要在创建它的线程上调用Realm/managed RealmObject/managed RealmResults。 – EpicPandaForce

2

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

它看起来好像你试图从后台线程访问你的领域,但如果你在主线程上创建它,那么你需要发回它。

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

它的工作,非常感谢你! –