首页 文章

performSelector:withObject:afterDelay:无法更改延迟值[关闭]

提问于
浏览
-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秒后调用该方法 . 关于可能导致这种情况的任何想法?

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将完全没有响应 .

相关问题