Swift Realm在写入块中重新添加Object时遇到困难

时间:2016-06-17 10:55:32

标签: swift realm

我使用的是Realm,该项目是1.0.0版本。

当我创建一个Realm Object列表(包含从Web API获取的数据)时,尝试使用结构中的此实用程序函数将它们保存到Realm中:

static func saveRealmObjects(objects: [Object]) {
    defer {
        // Never entered
    }

    for object in objects {
        let realm = try! Realm()

        do {
            try realm.write {
                print("TEST: 1: object: \(object)")
                realm.add(object)
                print("TEST: 2")
            }
        } catch {
            // Never entered
        }
    }
}

(请不要在确切的结构上判断我,我一直在四处寻找是否有效)。

我可以通过自由使用打印语句(大多数已在上面删除)告诉我该函数可以TEST: 1正常,但无法将其转到TEST: 2,因为第一个Object在列表中我传递给函数。

我应该注意这个函数在我第一次使用数据时会起作用(比如在擦拭模拟器并重新启动应用程序之后),但是如果我重新创建Object并尝试再次保存它们它被卡住了。

我假设Realm会使用Object上的私钥,并在必要时覆盖任何私钥。但它似乎只是卡住了。

-

然后 - 在它被卡住之后 - 如果我尝试从Realm获取另一组结果(使用不同的Realm对象),我会收到以下错误:

libc++abi.dylib: terminating with uncaught exception of type realm::InvalidTransactionException: Cannot create asynchronous query while in a write transaction

仅供参考我使用Realm

创建不同的try! Realm()对象

-

供参考,以下是我Object试图保存的内容:

import Foundation
import RealmSwift

class MyObject: Object {

    // MARK: Realm Primary Key

    dynamic var id: String = ""

    override static func primaryKey() -> String? {
        return "id"
    }


    // MARK: Stored Properties

    dynamic var date: NSDate? = nil

    dynamic var numA = 0

    dynamic var numB = 0
    dynamic var numC = 0

    dynamic var numD = 0
    dynamic var numE = 0

    dynamic var numF = 0
    dynamic var numG = 0

    dynamic var numH = 0


    // MARK: Computed Properties

    var computedNumI: Int {
        return numD + numE
    }

    var computedNumJ: Int {
        return numF + numG
    }

}

(变量名称已更改。)

-

希望我做一些明显错误的事情 - 这是我第一次使用Realm。

如果您有任何想法,为什么它会坚持(或许它是一个线程问题?),或者想要更多信息,请回答或评论。谢谢。

1 个答案:

答案 0 :(得分:1)

作为我聪明的木底鞋,我真的只是通过阅读文档找到了答案: https://realm.io/docs/swift/latest/#creating-and-updating-objects-with-primary-keys

添加到Realm行需要如下所示:

realm.add(object, update: true)

更新标记将更新已使用该主键保存的Object

-

虽然如果它在尝试添加相同的对象时发出某种明显的警告或崩溃,或者没有导致其他查询和写入Realm崩溃,那会很好。