我在一个类中有两个独立的委托方法。
- (void)delegateMethod1:(id)data {
self.data = data;
}
- (void)delegateMethod2 {
[someClass sendData:self.data];
}
现在,这有时可以正常工作,但有时,delegateMethod2会在delegateMethod1之前调用。
我需要知道如何优雅地管理它,以便只有在调用delegateMethod1和delegateMethod2时才调用行[someClass sendData:self.data];
。
我知道我可以通过使用变量在每个委托调用上设置某个内容来实现,但必须有一种优雅的方法来执行此操作。
任何帮助?
答案 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];
}