performSelector:withObject:afterDelay:不在模态视图控制器上工作

时间:2012-06-29 11:10:05

标签: ipad ios5 delegates modalviewcontroller performselector

我有一个模态视图控制器出现,检查互联网上的服务,然后在完成后自行解散。 nib包含一个活动指示器和一个标签,用于通知用户发生了什么。

更新完成后,标签将更改为“更新完成”,然后关闭视图控制器。但是,我希望它延迟解雇几秒钟,让用户有机会在文本消失之前看到它。所以我做到了这一点:

#pragma mark - AssetLoaderServiceDelegate

- (void)assetLoaderServiceDidFinishLoading:(AssetLoaderService *)service
{
    [self.spinner stopAnimating];
    self.infoLabel.text = @"Update complete";
    [self performSelector:@selector(dismissUpdater) withObject:nil afterDelay:2.0];
}

- (void)dismissUpdater
{
    [self dismissModalViewControllerAnimated:YES];
}

但由于某种原因,永远不会调用选择器。我也试过在模式NSRunLoopCommonModes中运行它,但这也不起作用。

我一定是做错了什么,但我看不出来......

编辑:委托回调实际上发生在NSOperationQueue内,这可能意味着它在将消息发送回视图控制器时不在同一个线程上?所以我试过

[self performSelector:@selector(downloadQueueComplete) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

接着是

- (void)downloadQueueComplete
{
    [delegate assetLoaderServiceDidFinishLoading:self];
}

但是performSelector似乎也没有在这里工作。

2 个答案:

答案 0 :(得分:2)

跟进你关于线程问题的建议,你会尝试:

[self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES]];

答案 1 :(得分:1)

排序!在AssetLoaderService中,我必须在主线程上执行选择器:

 [self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES];

之后,所有以下调用都在正确的线程上。 :)