2017-10-05 40 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

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