0

在我的 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...
}

请注意,我处于开发的早期阶段,代码并不完美,我只想知道为什么计时器没有启动。我想它与线程有关,但我不知道......

谢谢

4

2 回答 2

0

关于线程问题,您可能是正确的-就是这种情况,然后我认为您必须使用计划外的计时器并将其手动添加到运行循环中。试试这个,看看它是否有效:

NSTimer *t = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(mergeCoreDataFromCloud:) userInfo:nil repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:t forMode:NSDefaultRunLoopMode];
于 2012-06-08T23:11:10.470 回答
0

计时器依赖于运行循环在它被调度的模式下运行。

在 Cocoa 应用程序中,主线程自动运行其运行循环。但是,不能依赖其他线程来自动运行其运行循环。

所以,通常你想在主线程上安排定时器。您还可以将它们安排在您创建和控制的线程上,从而以适当的模式运行其运行循环。

您的问题中没有足够的信息来了解调用此代码的线程。

于 2012-06-09T02:51:42.517 回答