0

我想实现以下目标:

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

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

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

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

2 回答 2

0

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

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

于 2015-07-09T18:25:37.800 回答
0

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

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

  • 移除异步调用
  • 为您的方法使用串行队列
  • 添加布尔变量updateInProgress并签入getObjectList()-怎么做
  • 忽略数据可能已过时的事实 - 这是正确性与速度交易。
  • 让您的数据库通知其客户发生了一些变化
于 2015-07-09T18:34:29.717 回答