-2

私はperformSelector:withObject:afterDelayによって呼び出される非常に単純なメソッドを持っています:しかし、afterDelayにどの値を割り当てても、メソッドは常に10秒の遅延後に起動されます。このメソッドはURLRequestを呼び出し、完了時に別の要求を呼び出します(これが影響を与えるかどうかはわかりません)。

私は持っています:

-(void)connectionDidFinishLoading:(NSURLConnection*)connection {
    [self performSelector:@selector(poll) withObject:nil afterDelay: 1];
}
.....
-(void)poll
{
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    ....
    NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
    .....
}

afterDelayにどの値を割り当てても、メソッドは常に10秒後に呼び出されます。何がこれを引き起こす可能性があるかについてのアイデアはありますか?

4

1 に答える 1

1

NSURLConnectionDelegateは、メインスレッドとは異なるスレッドでメッセージを取得していますか?その場合は、代わりにメッセージをmainThreadに投稿してください。

NSLog(@"WILL SEND wait1sec");
[self performSelectorOnMainThread:@selector(wait1sec) withObject:nil waitUntilDone:NO];

それから

- (void)wait1sec
{
    NSLog(@"GOT wait1sec");
    [self performSelector:@selector(poll) withObject:nil afterDelay: 1];
}
- (void)poll
{
    NSLog(@"GOT poll()");
    ...

PS:dispatch_after()を使用すると、これをより簡単に行うことができますが、ブロックについて言及しなかったため、そこには行きませんでした。

PS:これをすべてのデリゲートメッセージに追加してみてください:

-(void....
{
    assert([NSThread isMainThread]);
    ...

それでもアプリがクラッシュしない場合は、何かがメインのrunLoop(メインスレッド上のrunLoop)をブロックしているため、おそらくどこかで何かを待っています。この場合、UIは完全に応答しなくなります。

于 2012-08-21T14:07:45.673 に答える