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

时间:2012-06-08 22:40:26

标签: objective-c core-data nstimer icloud

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

请注意我处于开发的早期阶段,代码并不完美,我只想知道计时器未启动的原因。 我想它与线程有关,但我猜不出来......

感谢

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

计时器依赖于运行循环以其已安排的模式运行。

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

因此,通常您希望在主线程上安排计时器。您还可以在您创建和控制的线程上安排它们,这将导致您以适当的模式运行其运行循环。

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