0

我在一个类中有两个独立的委托方法。

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

我相信,使用指示性变量是克服这个问题的最优雅的方法。但是这个变量必须保存在委托调用者对象中。

伪类解释

@interface DelegateCaller
{
   BOOL hasCalled1stMethod;
}
@property(nonatomic,weak) id delegate;
@end

@implementation DelegateCaller

-(void)in_some_process_1
{
   [self.delegate delegateMethod1]; //call
   hasCalled1stMethod = YES; //set indicator
}

-(void)in_some_process_2
{
   if(hasCalled1stMethod)
    {
       [self.delegate delegateMethod2]; //call
       hasCalled1stMethod = NO; //reset indicator for reuse, if required.
     }
}

@end

这样您就不必在委托本身中维护任何变量,因为调用的规则是在调用者对象本身中维护的。

另一种情况:如果从某个object1调用delegateMethod1,从某个其他object2调用delegateMethod2,那么指示性变量方法再次是最优雅的方式(在这个有限的场景中)

伪类解释:

@interface ClassDelegateObject //aka the callee
{
  BOOL hasCalledMethod1;
}
@end

@implementation ClassDelegateObject

-(void)delegateMethod1:(NSData*)data
{
   self.data = data; 
   hasCalledMethod1 = YES; //set the indicator.
}

-(void)delegateMethod2
{
   //here relying on the self.data!=nil will not be fruitful
   //in case the self.data is not nil and hold some previous garbage data then
   //this logic will fail.

   if(hasCalledMethod1) 
   {
     [someClass sendData:self.data]; 
     hasCalledMethod1 = NO; //reset the variable for reuse if required.
   }
}

@end
于 2013-08-19T09:55:54.950 回答
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 回答