【问题标题】:Sync objects between different Threads in Realm在 Realm 中的不同线程之间同步对象
【发布时间】:2021-02-05 16:02:10
【问题描述】:

我有一个不稳定的测试,在 wait-expectation 之后我可以得到 1 或 0 结果。如何强制刷新数据库?或者线程同步有什么问题?

func testFoo() {
    let realmConfiguration = Realm.Configuration(inMemoryIdentifier: UUID().uuidString)
    let realm = {
        return try! Realm(configuration: realmConfiguration)
    }
    let expectation = self.expectation(description: "expectation")
    let dispatch = DispatchQueue(label: "queue")

    dispatch.async {
        let event = EventObject()
        try realm().write {
            realm().add(event)
        }
        expectation.fulfill()
    }

    wait(for: [expectation], timeout: 2.0)

    let objects = realm().objects(EventObject.self)
    XCTAssertEqual(objects.count, 1)
}

【问题讨论】:

  • 2 秒的超时时间够吗?如果增加呢?此外,您的try 块没有catch。会不会是写的时候扔箭?
  • 是的,2秒就够了,写块执行没有任何错误
  • 不太确定问题是什么 - 您是否在某处遇到错误?也是一个问题;为什么这个realm() 而不是realmdocs 所示 - 这是问题的一部分吗?为什么不用let realm = try! Realm(configuration: config) 简化呢?第二次延迟的目的是什么?为什么不是 1s 或 100s?你能澄清被问到什么吗?最后,实时对象、集合和领域实例是线程受限的:也就是说,它们仅在创建它们的线程上有效
  • @Jay 从不同的线程工作需要不同的 Realm 对象实例,为此,我创建了一个块(或计算属性,等等)。第二个延迟在哪里?只有一个等待功能,超时时间为 2 秒。我的问题是,在等待期望之后,我有时会得到零个结果而不是一个......
  • 如果您需要不同的领域对象实例,您需要创建该对象的副本,因为领域对象是线程受限的。请参阅Copy Objects Between Realms 或者您可以使用Frozen Objects。请参阅Threading 了解一些其他提示,包括在不同线程上打开领域。

标签: ios swift realm


【解决方案1】:

你需要在 autoreleasepool 中创建 Realm 对象

dispatch.async {
    autoreleasepool {
        let event = EventObject()
        try realm().write {
            realm().add(event)
        }
    }
    expectation.fulfill()
}

您必须记住将所有内容包装在一个自动释放池中,这样对象就不会停留在后台线程上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多