0

私のアプリケーションでは、モーダルビューコントローラーとして表示されるログイン画面があります。ユーザーが正常にログインすると、モーダルビューが閉じられ、アプリケーションのデータがWebサービスから更新されます。その後、ユーザーはダウンロードした新しいデータを操作できます。

定期的に、サーバーに同期して戻す必要のあるデータがあるかどうかを確認します。AppDelegateこれを行うには、変更を定期的にポーリングする一連の関数を使用します。ポーリングを開始する方法が1つあります。

- (void) startBackgroundSync {
    if (self.queue == nil) {
        self.queue = [[NSOperationQueue alloc] init];
    }
    [self performSelector:@selector(doBackgroundSync) withObject:nil afterDelay:5.f];
}

そして、-doBackgroundSync実際に変更をチェックし、同期操作をに追加しますNSOperationQueue。次に、次のようにリセットされます。

-(void) doBackgroundSync {
    NSLog(@"Check for changes");
    // check for changes and add operation to queue
    [self performSelector:@selector(doBackgroundSync) withObject:nil afterDelay:5.f];
}

当初は-startBackgroundSync、モーダルログインビューコントローラから呼び出しました(却下される前)。次に、他のいくつかの設定を変更し、モーダルビューコントローラーを閉じます。ログインビューコントローラは、閉じられても解放されませんが、AppDelegateによって保持されます(後でアプリケーションを「再ロック」する必要がある場合があります)。モーダルビューコントローラが却下された後、-doBackgroundSync呼び出されることはありませんでした。-startBackgroundSyncモーダルビューコントローラが閉じられた後に表示されるメインビューコントローラに呼び出しを置く-doBackgroundSyncと、期待どおりに継続的に呼び出されます。

この動作の原因は何ですか?-dismissModalViewControllerそのViewControllerによって作成された実行ループ内の何かを無効にする何かがありますか?

4

1 に答える 1

0

詳細については、iOS 用の View Controller Programming Guide を参照してください。ただし、モーダル コントローラーを「閉じる」と、アプリケーションは以前の状態に戻ります。実行ループを維持するための推奨される方法は、モーダル コントローラーからデリゲートに依頼することです。

于 2010-10-15T14:47:32.740 に答える