10

バックグラウンドでも常に実行されるVoIPアプリケーションがあります。バックグラウンドにいる間、メインスレッドから呼び出しています:(ネットワークが失われたと診断した場合に備えてネットワーク接続を確立するため)。

[self performSelector :@selector(Reconnect:) withObject:nil afterDelay:60.0];

ただし、セレクターは、アプリがフォアグラウンドに戻ったときにのみ実行されます。バックグラウンドでセレクターを実行させるために、特に何かする必要がありますか?

ありがとう

編集:

-(void) reconectInBackgroundAfterDelay:(NSTimeInterval) dealy
{
    NSLog(@"reconectInBackgroundAfterDelay");
    UIApplication*   app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [self performSelector :@selector(Reconnect:) withObject:nil afterDelay:dealy];

        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

代わりにこのコードを追加しましたが、指定された遅延の後、「Reconnect」メソッドが呼び出されません。すでにバックグラウンドにいるときに、「reconectInBackgroundAfterDelay」メソッドを呼び出します。

他の提案はありますか?

編集2 解決策を見つけました。下記参照

4

3 に答える 3

22

私がこれまでに見つけた唯一の解決策:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

        NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(Reconnect:) userInfo:nil repeats:NO];    

        [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];

        [[NSRunLoop currentRunLoop] run]; 
    }); 
于 2011-10-10T14:13:26.463 に答える
1

この行をbeginBackgroundTaskWithExpirationHandlerブロックに入れましたか?http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.htmlのセクション「バックグラウンドでの有限長タスクの完了」を参照してください。

于 2011-10-09T13:43:11.540 に答える
1

私はしばらくの間それをテストしました、corebluetoothイベントが来るときにiOSバックグラウンドで実行することを発見しました、何か遅延をしたい場合はNSTimerオブジェクトを使用してください、あなたは10秒未満でなければなりません、そして10秒以上の場合、タイマーは無効。

于 2013-07-04T04:19:17.673 に答える