ios - AppDelegate中的NSTimer从不触发

标签 ios nstimer ios7.1

我需要任意启动一个NSTimer,它将每N秒重复一次,直到我停止它为止。 不重复。

我已经尝试过SO解决方案描述了hereherehere。接受的答案均无效。

这就是我所做的。我的UIViewController正在调用:

[AppDelegate doStartMessageRefresh];

在AppDelegate.m中:
#define MESSAGE_REFRESH_INTERVAL_SECONDS    3.0
@property (nonatomic, retain, strong) NSTimer *messageRefreshTimer;
- (void) doInvokerForDoStartMessageRefresh
{
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%@", [self.messageRefreshTimer fireDate]);
}
- (void) doStartMessageRefresh {
    NSLog(@"%s", __FUNCTION__);
    /*
    self.messageRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:MESSAGE_REFRESH_INTERVAL_SECONDS
                                                                target:self
                                                              selector:@selector(doInvokerForDoStartMessageRefresh)
                                                              userInfo:nil
                                                               repeats:YES];
    */
    self.messageRefreshTimer = [NSTimer timerWithTimeInterval:MESSAGE_REFRESH_INTERVAL_SECONDS
                                                       target:self
                                                     selector:@selector(doInvokerForDoStartMessageRefresh)
                                                     userInfo:Nil
                                                      repeats:YES];
    // [self.messageRefreshTimer fire];
    //[[NSRunLoop currentRunLoop] addTimer:self.messageRefreshTimer forMode:NSRunLoopCommonModes];
    [[NSRunLoop currentRunLoop] addTimer:self.messageRefreshTimer forMode:NSDefaultRunLoopMode];
}

打印出来的唯一日志行是:
2014-05-02 16:34:20.248 myappnamehere[9977:6807] -[AppDelegate doStartMessageRefresh]

如果我取消注释该行[self.messageRefreshTimer fire];它运行一次。

如果我将选择器制定为:@selector(doInvokerForDoStartMessageRefresh :)并手动触发,则会收到无法识别的选择器

最佳答案

您的方法签名错误。应该是doInvokerForDoStartMessageRefresh:doInvokerForDoStartMessageRefresh:(NSTimer *)timer,而不是doInvokerForDoStartMessageRefresh。注意:是方法名称的一部分!没有冒号,则是完全不同的方法。

这是设置重复计时器的方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];

  return YES;
}

- (void)timer:(NSTimer *)timer
{
  NSLog(@"%@", [NSDate date]);
}

另外,如果要在属性中存储计时器,请不要这样做:
@property (nonatomic, retain, strong) NSTimer *messageRefreshTimer;

只是这样做:
@property NSTimer *messageRefreshTimer;

关于ios - AppDelegate中的NSTimer从不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23438599/

相关文章:

ios - 使用计时器安排通知触发

iOS 7.1 UINavigationbar 和 UIToolbar

ios - 当单元格的元素的框架改变时更新 tableView

ios - 无法在 Storyboard 上引用 UILabel

iphone - 实现游戏计时器的最有效方法是什么

iOS 我的 UIView 在屏幕上可见吗?

ios7.1:推送通知角标(Badge)更新问题

iOS 7.1 imagePicker CameraFlashMode 不指示 Flash 状态

iphone - 我如何测试某个表格 View 单元格是否具有特定图像?

ios - 无法让 API 调用及时运行 tableview swift 4 xcode 9