2017-02-17 56 views
1

使用Xcode的-8.2.1,斯威夫特-3.0.2,RealmSwift-2.2.0,iOS的模擬器-10:境界異步線程斯威夫特3

想寫一個視圖模型與領域,對象,我無法在另一個線程中創建returnArray。問題是對先前創建的領域對象的訪問失敗(很可能是由於後臺線程訪問?)。

有人可以告訴我什麼是錯誤的,下面的代碼(見下文): 重要提示:在「getEntries-completionHandler」之前調用「createDataEntries() - 方法」正確的SimPholders realmobject-entry)!因此,「類別」被設置爲「愛」(見代碼)

import Foundation 
import RealmSwift 

class MVVMCBalancesModel: BalancesModel 
{ 

    fileprivate var entries = [BalancesDataEntry]() 
    let realm = try! Realm() 

    init() { 
     self.createDataEntries() 
    } 

    fileprivate func createDataEntries() { 

     let myBalance = BalancesDataEntry() 
     myBalance.index = 0 
     myBalance.category = "Love" // !!!!!!! Here the category is filled 

     try! self.realm.write { 

      self.realm.deleteAll() 
      self.realm.add(myBalance) 
     } 
    } 

    func getEntries(_ completionHandler: @escaping (_ entries: [BalancesDataEntry]) -> Void) 
    { 
     // Simulate Aysnchronous data access 
     DispatchQueue.global().async { 

      var returnArray: [BalancesDataEntry] = [BalancesDataEntry]() 
      let realmy = try! Realm() 
      let cnt = realmy.objects(BalancesDataEntry.self).count 
      for idx in 0 ..< cnt { 
       let obj = realmy.objects(BalancesDataEntry.self).filter("index = \(idx)").first! 
       returnArray.append(obj) 
      } 
      completionHandler(returnArray) // !!!!!!! BREAKPOINT (see screenshot below) 
     } 
    } 
} 

運行上面的代碼和設置在completionHandler(returnArray)斷點產生以下:

​​

爲什麼是returnArray的「類別」是一個空字符串?

回答

4

從領域中檢索到的對象的屬性被從底層存儲中延遲檢索。從Swift訪問屬性將返回適當的值。同樣,如果從Xcode的LLDB控制檯運行po returnArray,則應該看到該對象的完整狀態。調試器彈出窗口中顯示的實例變量僅在對象處於非託管狀態時(在添加到領域之前)纔會使用。

+0

哦,我不知道!這是一個相當的陷阱!你是完全正確的,一旦我做了print(returnArray [0] .category),正確的值'Love'顯示在控制檯中。而且你的Xcode的LLDB控制檯的'po returnArray'也能工作!非常感謝你的解釋。 – iKK

+0

也在調試器中,如果你這樣做:「po returnArray [0] .category」的作品 – jerrygdm