NSTimer 应该从通知调用的方法内部触发



在我的iOS应用程序中,我已经将AppDelegate注册为CoreData更改的通知侦听器。使用这段代码:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(mergeChangesFromContextDidSaveNotification:)
        name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
      object:[self persistentStoreCoordinator]];

每次有更新时,都会正确调用mergeChangesFromContextDidSaveNotification方法。

但是在此方法中,我尝试调用 NSTimer 来执行另一个操作:

- (void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification {
        NSTimer *t =[NSTimer scheduledTimerWithTimeInterval:10.0
                                                           target:self 
                                                         selector:@selector(mergeCoreDataFromCloud:)
                                                         userInfo:nil 
                                                          repeats:NO];
    }
}

关键是 mergeCoreDataFromCloud: 应该由计时器触发的永远不会被调用。这是签名:

-(void)mergeCoreDataFromCloud:(NSTimer*)timer {
  // never called...
}
请注意,我

处于开发的早期阶段,代码并不完美,我只对知道为什么计时器没有启动感兴趣。我想这与线程有关,但我没有猜测......

谢谢

计时器依赖于在计划模式下运行的运行循环。

在 Cocoa 应用程序中,主线程会自动运行其运行循环。 但是,没有其他线程可以自动运行其运行循环。

因此,通常您希望在主线程上安排计时器。您还可以在您创建和控制的线程上调度它们,从而使该线程以适当的模式运行其运行循环。

您的问题中没有足够的信息来知道此代码是在哪个线程上调用的。

关于线程问题,您可能是对的 - 确实如此,那么我认为您必须使用计划外计时器并将其手动添加到运行循环中。试试这个,看看它是否有效:

NSTimer *t = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(mergeCoreDataFromCloud:) userInfo:nil repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:t forMode:NSDefaultRunLoopMode];

最新更新