【发布时间】: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()而不是realm如docs 所示 - 这是问题的一部分吗?为什么不用let realm = try! Realm(configuration: config)简化呢?第二次延迟的目的是什么?为什么不是 1s 或 100s?你能澄清被问到什么吗?最后,实时对象、集合和领域实例是线程受限的:也就是说,它们仅在创建它们的线程上有效 -
@Jay 从不同的线程工作需要不同的 Realm 对象实例,为此,我创建了一个块(或计算属性,等等)。第二个延迟在哪里?只有一个等待功能,超时时间为 2 秒。我的问题是,在等待期望之后,我有时会得到零个结果而不是一个......
-
如果您需要不同的领域对象实例,您需要创建该对象的副本,因为领域对象是线程受限的。请参阅Copy Objects Between Realms 或者您可以使用Frozen Objects。请参阅Threading 了解一些其他提示,包括在不同线程上打开领域。