Swift 完成块
Swift Completion Block
我想实现以下目标:
- 在 B 类中,添加 1 个对象后重新加载我的数据库。
reloadDatabase()
在 completionBlock 中调用。
- 在classB中,
reloadDatabase()
会在classA
中调用getObjects()
获取最新的数据库对象列表并传递给classB中的objectList
问题:如何确保每当我在 classB 中调用 getObjectList()
时,我将始终获得最新的列表?据我了解,我的 objectList
可能不会在 reloadDatabase() block
中更新。我可以在 reloadDatabase()
尚未到达完成块时调用 getObjectList()
(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
}
}
在您的问题中,您没有说明是否会从不同线程调用这些函数中的任何一个。因此,当您在 classB 中调用 addObject() 时,执行甚至不会继续,直到重新加载数据库并更新 objectList。
使用闭包和块并不自动意味着代码将在不同的上下文中执行。
从您的代码片段来看,在我看来没有异步调用,因此您将无法在 reloadDatabase()
块之前调用 getObjectList()
。如果您不将闭包与某些东西(例如 GCD)一起使用,则闭包不是异步的。
如果您有异步调用,但它们不在代码片段中,则可以在执行 reloadDatabase()
时调用 getObjectList()
。那么你有几个选择:
- 移除异步调用
- 使用 serial queue 作为您的方法
- 添加布尔变量
updateInProgress
并在 getObjectList()
- how to do it 中检查它
- 忽略数据可能已过时的事实 - 这是正确性与速度交易。
- 让您的数据库通知其客户发生了某些变化
我想实现以下目标:
- 在 B 类中,添加 1 个对象后重新加载我的数据库。
reloadDatabase()
在 completionBlock 中调用。 - 在classB中,
reloadDatabase()
会在classA
中调用getObjects()
获取最新的数据库对象列表并传递给classB中的objectList
问题:如何确保每当我在 classB 中调用 getObjectList()
时,我将始终获得最新的列表?据我了解,我的 objectList
可能不会在 reloadDatabase() block
中更新。我可以在 reloadDatabase()
尚未到达完成块时调用 getObjectList()
(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
}
}
在您的问题中,您没有说明是否会从不同线程调用这些函数中的任何一个。因此,当您在 classB 中调用 addObject() 时,执行甚至不会继续,直到重新加载数据库并更新 objectList。
使用闭包和块并不自动意味着代码将在不同的上下文中执行。
从您的代码片段来看,在我看来没有异步调用,因此您将无法在 reloadDatabase()
块之前调用 getObjectList()
。如果您不将闭包与某些东西(例如 GCD)一起使用,则闭包不是异步的。
如果您有异步调用,但它们不在代码片段中,则可以在执行 reloadDatabase()
时调用 getObjectList()
。那么你有几个选择:
- 移除异步调用
- 使用 serial queue 作为您的方法
- 添加布尔变量
updateInProgress
并在getObjectList()
- how to do it 中检查它
- 忽略数据可能已过时的事实 - 这是正确性与速度交易。
- 让您的数据库通知其客户发生了某些变化