Swift完成块

时间:2015-07-09 17:57:19

标签: swift closures completion-block

我想实现以下目标:

  1. 在classB中,添加1个对象后重新加载我的数据库。在completionBlock中调用reloadDatabase()
  2. 在classB中,reloadDatabase()将调用getObjects()中的classA以获取最新的数据库对象列表,并传递给classB中的objectList
  3. 问题:我如何确保每当我在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 
         }
        }
    

2 个答案:

答案 0 :(得分:0)

在你的问题中,你不会说你是否会从不同的线程中调用这些函数中的任何一个。因此,当您在classB中调用addObject()时,执行将不会继续,直到重新加载数据库并更新objectList。

使用闭包和块并不会自动暗示代码将在不同的上下文中执行。

答案 1 :(得分:0)

在您的代码段中,我似乎没有异步调用,因此您无法在getObjectList()阻止之前调用reloadDatabase()。如果您不将它们与某些东西(例如GCD)一起使用,则闭包不是异步的。

如果您有异步调用,但它们不在代码段中,则在getObjectList()执行时可以调用reloadDatabase()。那么你有几个选择:

  • 删除异步调用
  • 使用serial queue作为您的方法
  • 添加布尔变量updateInProgress并在getObjectList() - how to do it
  • 中查看
  • 忽略数据可能过时的事实 - 这是正确性与速度交易。
  • 让您的数据库通知其客户端已更改内容