在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;
}
显然我的问题不是那么微不足道的事情,但我试图尽可能简单地得到答案,我被建议使用模态方法,但我不认为这是我正在寻找的解决方案。
我该怎么做才能解决这个问题?!
答案 0 :(得分:2)
我该怎么做才能解决这个问题?!
您希望将值返回到?在您的示例中,method1
将在调用method2
之前很久完成。如果要保留method2
计算的值,通常会使用该方法将值存储在ClassB的一个实例变量中,并可能调用其他方法继续处理。
如果您确实需要method1
从method2
返回结果,则需要同步调用它(即没有-performSelector:withObject:afterDelay:
)。在这种情况下,考虑a)为什么你需要延迟; b)如果你应该在延迟后拨打method1
而不是method2
。
如果您能解释一下您要解决的现实问题,我们将能够提供更好的帮助。
答案 1 :(得分:2)
您真正需要的是更好地理解异步方法。在method1
中,变量a
永远不会被更改 - 您正在做的就是安排将来调用method2
,然后返回变量a
的当前状态
在Objective-C中,有几种不同的方法可以解决这个问题。人们最常使用protocols
和delegates
来解决此问题。这是一个基本的intro to protocols and delegates。基本上,您希望您的A类对象成为B类对象的委托。您也可以使用NSNotifications或blocks,但在继续使用通知和阻止之前,您应该了解协议和委托的用法(它们在Objective-C中非常重要)。