繁体   English   中英

迅速完成区块

[英]Swift Completion Block

我要实现以下目标:

  1. 在classB中,添加1个对象后重新加载数据库。 在completionBlock中调用reloadDatabase()
  2. 在classB中, reloadDatabase()将在classA调用getObjects()以获取最新的数据库对象列表,并传递给objectList中的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() 然后,您有几个选择:

  • 删除异步调用
  • 对方法使用串行队列
  • 添加布尔变量updateInProgress并在getObjectList()检查- 如何执行
  • 忽略数据可能已过时的事实-正确与速度贸易。
  • 让您的数据库通知客户发生了一些变化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM