如何从另一个类运行方法

时间:2014-10-24 14:16:08

标签: objective-c xcode

在TabBarViewController类中,我有运行NSTimer的startUpdateNPendingMessagesTimer方法

我还timerStop使用invalidate方法停止此NSTimer

-(void)startUpdateNPendingMessagesTimer {
    NSLog(@"Starting UpdateNPendingMessagesTimer");
    checkNPendingMessagesTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(onUpdateNPendingMessages:) userInfo:nil repeats:YES];
}
-(void)timerStop
{
    [checkNPendingMessagesTimer invalidate];
    checkNPendingMessagesTimer = nil;
}

在另一个班级settingsViewController中,我有一个按钮,实际上必须激活timerStop方法。

     -(IBAction)deconnexion {    ....        
    }

我应该在按钮操作中写什么来激活timerStop方法? 换句话说,如何从目标C中的另一个类激活方法?

2 个答案:

答案 0 :(得分:2)

有很多选择:

  • 通过通知中心通知
  • Lambda回调(用objc术语称为" block") - 将其传递给运行计时器并存储它的对象。适当时调用
  • 使用委托的omnipresent(in cocoa)模式 - 创建委托对象并将其传递给包含计时器的类。适当时调用此对象的方法。

我使用block / lambda,因为它干净,高效,比其他解决方案的开销更少,并且节省了打字(是的!)。

答案 1 :(得分:0)

您可以使用通知中心在两个不相关的类之间进行通信。

首先在你的TabBarViewController类的ViewDidLoad中注册一个特定的通知(用“名称”标识),代码如下:

 [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(timerStop) 
        name:@"aNameOfaNotification"
        object:nil];

然后在您的“deconnexion”方法中,您只需发布相同名称的通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"aNameOfaNotification" 
    object:nil];

每个观察到Notification Name的类都将触发selector:argument中指定的本地方法,在本例中为:timerStop。

如果您不使用ARC,请注意,您可能还需要通过在此类中添加以下代码来取消注册TabBarViewController类:

-(void) dealloc {
      [[NSNotificationCenter defaultCenter] removeObserver:self];
      [super dealloc];
}

(您还可以使用:viewWillAppear / viewWillDisappear作为addObserver / removeObserver代码)

Bonne chance!