0

私は以下を達成したい:

  1. classB では、1 つのオブジェクトを追加した後にデータベースをリロードします。reloadDatabase()completionBlock 内で呼び出されます。
  2. classB では、データベース オブジェクトの最新のリストを取得するためにreloadDatabase()呼び出さgetObjects()れ、classB に渡されます。classAobjectList

質問: getObjectList()classB で呼び出すたびに、常に最新のリストを取得するにはどうすればよいですか? 私の理解では、objectList更新されていない可能性がありますreloadDatabase() blockgetObjectList()まだ完了ブロックに達していないときに呼び出すことができます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 
     }
    }
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 に答える