Swift Realm Write方法是Sync或Async Thread

时间:2017-01-13 08:49:29

标签: ios swift realm

我在我的项目中使用Realm,我想知道realm.write()方法是否同步。 我的例子在这里:

 let realm = try! Realm()
    try! realm.write {
        realm.delete(message)
    }
    realm.invalidate()

在上面的例子中,我正在删除一个领域对象和我写的外部括号invalidate()

这是我的困惑:

  1. 如果write()是同步的,那么invalidate()就可以了

  2. 如果Async比之前写的invalidate将调用,而realm将释放但操作正在后台运行

  3. 谢谢

2 个答案:

答案 0 :(得分:3)

Realm.write是同步的。 It just calls realm.beginWrite()/realm.commitWrite() with some error handling

public func write(_ block: (() throws -> Void)) throws {
    beginWrite()
    do {
        try block()
    } catch let error {
        if isInWriteTransaction { cancelWrite() }
        throw error
    }
    if isInWriteTransaction { try commitWrite() }
}

答案 1 :(得分:-2)

您编写的方法是同步方法,因为您没有为其指定后台队列。 Invalidate()方法的目的

func invalidate() 描述 使Realm管理的所有对象,结果,链接对象和列表无效。 Realm对其访问的数据版本保持读锁定,因此在不同线程上对Realm所做的更改不会修改或删除此Realm看到的数据。调用此方法会释放读取锁定,允许磁盘上使用的空间由以后的写入事务重用,而不是增长文件。在对先前从您不再需要的Realm读取数据的后台线程执行长阻塞操作之前,应调用此方法。 从当前线程上的此Realm实例获取的所有对象,结果和列表实例均无效。无法使用对象和数组。结果将变空。 Realm本身仍然有效,下次从Realm读取数据时会隐式启动新的读取事务。 连续多次调用此方法而不从Realm读取任何数据,或者在从Realm读取任何数据之前,这是一个无操作。可能无法在只读领域上调用此方法。