创建一个使用延迟返回的方法

时间:2012-05-26 15:34:29

标签: iphone objective-c ios xcode

在xcode上工作我意识到如果我创建一个非void方法,我从类/方法中调用它,只有当动作是立即时才会以最佳方式处理结果。我尝试通过插入延迟进行测试,我意识到它不再有用。 我将在这里写下我创建的示例:

A类

//--------------------CLASS A
- (void)viewDidLoad {
   [super viewDidLoad];
   i = 0;
   Class *classB = [[Class alloc] init];
   i = [classB method1];
   [self performSelector:@selector(method3) withObject:NULL afterDelay:1.8];
}

-(void)method3 {
   NSLog(@"i = %i",i); // i = 0
}

B类

//--------------------CLASS B    
-(int)method1 {
  [self performSelector:@selector(method2) withObject:NULL afterDelay:1];
  return a;
}

-(void)method2 {
  a = 800;
}

显然我的问题不是那么微不足道的事情,但我试图尽可能简单地得到答案,我被建议使用模态方法,但我不认为这是我正在寻找的解决方案。

我该怎么做才能解决这个问题?!

2 个答案:

答案 0 :(得分:2)

  

我该怎么做才能解决这个问题?!

您希望将值返回到?在您的示例中,method1将在调用method2之前很久完成。如果要保留method2计算的值,通常会使用该方法将值存储在ClassB的一个实例变量中,并可能调用其他方法继续处理。

如果您确实需要method1method2返回结果,则需要同步调用它(即没有-performSelector:withObject:afterDelay:)。在这种情况下,考虑a)为什么你需要延迟; b)如果你应该在延迟后拨打method1而不是method2

如果您能解释一下您要解决的现实问题,我们将能够提供更好的帮助。

答案 1 :(得分:2)

您真正需要的是更好地理解异步方法。在method1中,变量a永远不会被更改 - 您正在做的就是安排将来调用method2,然后返回变量a的当前状态

在Objective-C中,有几种不同的方法可以解决这个问题。人们最常使用protocolsdelegates来解决此问题。这是一个基本的intro to protocols and delegates。基本上,您希望您的A类对象成为B类对象的委托。您也可以使用NSNotificationsblocks,但在继续使用通知和阻止之前,您应该了解协议和委托的用法(它们在Objective-C中非常重要)。