-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 - 您的主线程上的那个 - 所以您可能正在某个地方等待某些东西。在这种情况下,您的 UI 将完全没有响应。

于 2012-08-21T14:07:45.673 回答