快速完成 block

标签 swift closures completion-block

我想实现以下目标:

  1. 在 B 类中,添加 1 个对象后重新加载数据库。 reloadDatabase() 在completionBlock 内调用。
  2. 在 classB 中,reloadDatabase() 将调用 classA 中的 getObjects() 来获取最新更新的数据库对象列表并传递给 objectList在类B

问题:如何确保每当我在 classB 中调用 getObjectList() 时,我总是会获得最新的列表?据我了解,我的 objectList 可能不会在 reloadDatabase() block 中更新。当 reloadDatabase() 尚未到达完成 block 时(objectList 仍然是旧的 objectList),我可以调用 getObjectList()

我对闭包和 block 还很陌生。非常感谢任何指导!

    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 
     }
    }

最佳答案

从您的代码片段来看,在我看来没有异步调用,因此您无法在 reloadDatabase() block 之前调用 getObjectList() 。如果您不将闭包与某些东西(例如 GCD)一起使用,那么闭包就不是异步的。

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

  • 删除异步调用
  • 使用serial queue对于你的方法
  • 添加 bool 变量updateInProgress并在getObjectList()中检查它 - how to do it
  • 忽略数据可能已过时的事实 - 这是正确性与速度交易的关系。
  • 让您的数据库通知其客户端某些内容发生了变化

关于快速完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324906/

相关文章:

ios - Alamofire 上传带有进度的大文件并在应用重启时显示进度

javascript - JavaScript 函数中的 var 作用域

c++ - 如何声明接受字符串并返回 void 的闭包类型?

javascript - 如何在 jQuery 之前加载的闭包中检查/使用 jQuery?

ios - 动画完成 block 运行得太快

ios - Swift - 表达式列表中的预期表达式

iOS - Firebase 过滤器查询

ios - 使用 BOOL/完成 block 停止自动反转/无限重复 UIView 动画

ios - 使用 GoogleMaps 时,myLocationEnabled 会在 swift 上更改为 isMyLocationEnabled

带有完成 block 的 Swift 异步