在使用performSelector afterDelay:0时,排队的视图更新没有发生

时间:2010-05-06 19:32:00

标签: iphone objective-c

我有一个应用程序,它根据到达套接字或本地用户交互的数据执行一些计算。

我想在计算发生时显示'活动微调器'。

spinner = [[UIActivityIndiactorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[spinner setCenter:self.view.center];
[self.view addSubview:spinner];
[spinner startAnimating];
[self performSelector:@selector(doCalcs) withObject:nil afterDelay:0];

这种方法效果很好,但代码是通过网络到达消息而运行的情况除外。我正在使用http://code.google.com/p/cocoaasyncsocket/来处理套接字,代码在onSocket:didReadData:withTag:方法中运行。

'doCalcs'需要几秒钟。旋转器在运行时不会出现。

如果我将afterDelay:0更改为afterDelay:1,那么微调器确实会出现doCalcs正在运行的整个时间,但缺点是需要额外的秒。所以看起来代码都是正确的,但无论出于何种原因,在doCalcs运行之前,微调器都没有机会进入屏幕。

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

您可以尝试在后台线程上进行计算,以防止动画阻塞:

[self performSelectorInBackground:@selector(doCalcs)withObject:nil];

答案 1 :(得分:0)

您需要生成一个线程来进行计算,而不是选择器。如果应用允许通过事件循环跳转,则仅更新UI。而你的方法是阻止的。或者,你可以定时调用你的“doCalcs”方法直到它们完成......它应该在一段时间后退出,这样事件循环就可以执行并在“切片”中执行计算。如果您需要进一步指导,请告诉我!