在我的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];