领域异步线程 Swift 3

iKK*_*iKK 1 asynchronous realm swift

使用 Xcode-8.2.1、Swift-3.0.2、RealmSwift-2.2.0、iOS-Simulator-10:

尝试使用 Realm-Object 编写视图模型时,我无法在另一个线程中创建 returnArray。问题是对先前创建的领域对象的访问失败(很可能是由于后台线程访问??)。

任何人都可以告诉我以下代码有什么问题(见下文):重要提示:在“getEntries-completionHandler”之前调用了“createDataEntries()-method”(可以通过正确的 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行上面的代码并在 completionHandler(returnArray) 处设置断点会产生以下结果:

在此处输入图片说明

为什么 returnArray 的“类别”是一个空字符串???

bda*_*ash 5

从 Realm 检索的对象的属性是从底层存储延迟检索的。从 Swift 访问属性将返回适当的值。同样,如果您po returnArray从 Xcode 的 LLDB 控制台运行,您应该会看到对象的完整状态。调试器弹出窗口中显示的实例变量仅在对象不受管理时(在添加到领域之前)使用。