一类中的两种独立代表方法

时间:2013-08-19 09:16:47

标签: iphone ios objective-c ipad cocoa-touch

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

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

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

现在,这有时可以正常工作,但有时,delegateMethod2会在delegateMethod1之前调用。

我需要知道如何优雅地管理它,以便只有在调用delegateMethod1和delegateMethod2时才调用行[someClass sendData:self.data];

我知道我可以通过使用变量在每个委托调用上设置某个内容来实现,但必须有一种优雅的方法来执行此操作。

任何帮助?

3 个答案:

答案 0 :(得分: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];
}

(我假设所有委托方法都在主线程上调用,否则 一个人必须添加一些同步。)

答案 1 :(得分: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

答案 2 :(得分: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];
}