我要实现以下目标:


在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/

10-12 14:49