0

クラスに 2 つの独立したデリゲート メソッドがあります。

    - (void)delegateMethod1:(id)data {
         self.data = data;
    }

    - (void)delegateMethod2 {
         [someClass sendData:self.data];
    }

現在、これは正常に機能する場合もありますが、delegateMethod2 が delegateMethod1 の前に呼び出されることもあります。

[someClass sendData:self.data];delegateMethod1 と delegateMethod2 の両方が呼び出された場合にのみ次の行が呼び出されるように、これをエレガントに管理する方法を知る必要があります。

変数を使用して各デリゲート呼び出しで何かを設定することでそれを実行できることはわかっていますが、これを行うにはエレガントな方法が必要です。

何か助けはありますか?

4

3 に答える 3

1

どのデリゲートが呼び出されたかを覚えておくことは、私にとって最も簡単でクリーンな解決策のようです。ただし、チェックを別のメソッドに移動することで対称にすることができるため、どのデリゲートが最初に呼び出されても問題ありません。

- (void)checkIfDataCanBeSent {
    if (self.method1called && self.method2called) {
         [someClass sendData:self.data];
    }
}

- (void)delegateMethod1:(id)data {
     self.method1called = YES;
     // ...
     [self checkIfDataCanBeSent];
}

- (void)delegateMethod2 {
     self.method2called = YES;
     // ...
     [self checkIfDataCanBeSent];
}

(すべてのデリゲート メソッドがメイン スレッドで呼び出されると仮定しました。そうでない場合は、何らかの同期を追加する必要があります。)

于 2013-08-19T10:06:23.510 に答える
0

コードの仕組みを再考することをお勧めします。おそらく、データがないかどうかを確認し、準備ができたら送信してください。

- (void)delegateMethod1:(id)data {
     self.data = data;
     if (self.dataShouldBeSentWhenReady) {
       [self sendData];
     }
}

- (void)delegateMethod2 {
     if (self.data) {
       [self sendData];
     } else {
       [self setDataShouldBeSentWhenReady:YES];
     }
}

- (void)sendData {
    [self setDataShouldBeSentWhenReady:NO];
    [someClass sendData:self.data];
}
于 2013-08-19T13:42:44.567 に答える