1

5 分ごとに呼び出されるバックグラウンド メソッドがあります。

そのメソッドはNSURLConnection、データを Web サービスに送信するために使用します。
その方法には、次のコードがあります。

...
conn =  [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
    NSPort* port = [NSPort port];
    NSRunLoop* rl = [NSRunLoop currentRunLoop];
    [rl addPort:port forMode:NSDefaultRunLoopMode];
    [conn scheduleInRunLoop:rl forMode:NSDefaultRunLoopMode];
    [conn start];
    [rl run];
...

バックグラウンドで WS を呼び出すので、このデリゲート メソッド (didReceiveData、didFail など) がないと呼び出されないため、このコードを使用します。http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

からこのトリックを取得します 。問題は、5 分が経過し、このメソッドが初めて呼び出されたときに次の 5 分間待機しないことです。もう一度呼び出しますが、ほぼ毎秒 Web サービスを呼び出します。 この NSRunLoop を何らかの形で無効にする必要があると思いますが、方法と場所がわかりませんか?


4

2 に答える 2

3

接続がバックグラウンドにあるときにデリゲート メソッドが呼び出されない理由を疑問に思っている場合: 接続をバッ​​クグラウンド キューに入れると、キューが完了した後に押しのけられるため、取得できません。デリゲート コールバック。接続はメイン キューにある必要があるため、コールバックが発生するまで実行ループにとどまります。または、あなたの場合は、独自の実行ループを作成します。

実行ループを処理したくない場合は、接続をメイン キューに入れるだけです。

dispatch_async(dispatch_get_main_queue(), ^(void){
    conn =  [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
    [conn start];
}

次に、デリゲート コールバックを取得する必要があります。

于 2012-11-07T09:29:51.963 に答える
0

参考までに、元の質問で a を無効にする方法については、[[NSRunLoop currentRunLoop] run]できません。

終了可能な実行ループを実装する方法については、ドキュメントを参照してください。

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
于 2015-06-11T13:47:14.537 に答える