在本教程之后,我编写了以下类:
import RealmSwift
import Darwin
import SwiftUI
let app = App(id: "my-app-id")
class AccessManager: Object {
@objc dynamic var isInTime: Bool = false
func foo2() -> Bool {
return true
}
func foo1() {
app.login(credentials: Credentials.anonymous) { (result) in
DispatchQueue.main.async {
switch result {
case .failure(let error):
print("Login failed: (error)")
case .success(let user):
print("Login as (user) succeeded!")
let client = app.currentUser!.mongoClient("mongodb-atlas")
let database = client.database(named: "my-database")
let collection = database.collection(withName: "my-collection")
let identity = "my-identity"
collection.find(filter: ["_partition": AnyBSON(identity)], { (result) in
switch result {
case .failure(let error):
print("Call to MongoDB failed: (error.localizedDescription)")
case .success(let documents):
self.bar = self.foo2()
print(self.bar) // prints true
}
})
print(self.bar) // prints false
}
}
}
}
}
当我在collection.find
范围内(使用self.foo2
函数)改变self.bar
的值时,它的值在该范围外不会改变-即在第一个print(self.bar)
-true
中打印,但在第二个false
中打印。
如何更改self.bar
的值,使更改也将在collection.find
的范围之外生效?
正如@Jay评论的:
闭包是异步的,闭包后面的代码也是异步的(可以)在闭包中的代码之前执行。这段代码会打印出来在值设置为true之前为False。代码比数据只在闭包中有效。
这就是为什么在我的例子中,闭包外的print(self.bar)
在collection.find
闭包之前执行。因此,它的结果是false
而不是true
。