0

私のiOSアプリケーションでは、CoreData変更の通知リスナーとしてAppDelegateを登録しました。このコードで:

[[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

タイマーは、スケジュールされたモードで実行されている実行ループに依存しています。

Cocoaアプリでは、メインスレッドは実行ループを自動的に実行します。ただし、実行ループを自動的に実行するために他のスレッドに依存することはできません。

したがって、通常はメインスレッドでタイマーをスケジュールする必要があります。作成および制御するスレッドでそれらをスケジュールすることもできます。これにより、実行ループが適切なモードで実行されます。

このコードがどのスレッドで呼び出されているかを知るための十分な情報が質問にありません。

于 2012-06-09T02:51:42.517 に答える
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 に答える