【问题标题】:Swift Completion Block快速完成块
【发布时间】:2015-07-09 17:57:19
【问题描述】:

我想实现以下目标:

  1. 在 B 类中,添加 1 个对象后重新加载我的数据库。 reloadDatabase() 在完成块中被调用。
  2. 在B类中,reloadDatabase()会调用classA中的getObjects()来获取最新的数据库对象列表并传递给B类中的objectList

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

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

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

【问题讨论】:

    标签: swift closures completion-block


    【解决方案1】:

    从您的 sn-ps 看来,在我看来没有异步调用,因此您将无法在 reloadDatabase() 块之前调用 getObjectList()。如果您不将闭包与某些东西(例如 GCD)一起使用,则闭包不是异步的。

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

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

    【讨论】:

      【解决方案2】:

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

      使用闭包和块并不意味着代码将在不同的上下文中执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        相关资源
        最近更新 更多