我要实现以下目标:
在classB中,添加1个对象后重新加载数据库。 reloadDatabase()
在completionBlock中调用。
在classB中,reloadDatabase()
将在getObjects()
中调用classA
以获取数据库对象的最新列表,并传递给classB中的objectList
问题:如何确保每当在classB中调用getObjectList()
时,我始终会得到最新列表?据我了解,我的objectList
可能未在reloadDatabase() block
中进行更新。当getObjectList()
尚未到达完成块时,我可能正在调用reloadDatabase()
(objectList仍然是旧的objectList)。
我对闭包和块很陌生。任何指导,不胜感激!
class classA: NSObject {
func addThisObject(object: RLMObject, completionBlock: () -> ())){
...
completionBlock()
}
func getObjects (completionBlock: ((list: [RLMObject]) -> ())){
var recordList = [RLMObject]()
...
completionBlock(list: recordList)
}
}
class classB: NSObject {
var objectList = [RLMObject]()
func addObject (object: RLMObject) {
classA().addThisObject(object, completionBlock: {() -> () in
self.reloadDatabase()
})
}
func reloadDatabase() {
classA().getObjects{(list) -> () in
self.objectList = list
}
}
func getObjectList() -> [RLMObject] {
return objectList
}
}
最佳答案
从您的代码片段看来,我似乎没有异步调用,因此您将无法在getObjectList()
块之前调用reloadDatabase()
。如果您不将闭包与某些东西(例如GCD)一起使用,则它们不是异步的。
如果您有异步调用,但它们不在代码段中,则可以在执行getObjectList()
时调用reloadDatabase()
。然后,您有几个选择:
删除异步调用
使用serial queue作为您的方法
添加布尔变量updateInProgress
并在getObjectList()
-how to do it中进行检查
忽略数据可能已过时的事实-正确与速度贸易。
让您的数据库通知客户发生了一些变化
关于swift - swift 完成块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31324906/