2

我目前正在开发一个项目,我在控制器中请求和解析多个 html 站点。为了给用户一些反馈,我创建了第二个视图,它在数据处理过程中显示。它显示状态标签和进度条。在我的控制器中,我有几个点可以更新标签文本。不幸的是,这只有时有效。我想那是因为标签偶尔会重绘一次,而且我尝试这样做的频率可能比每秒一次的频率更高。

使用 [label setNeedsDisplay] 强制重绘不起作用;

我还创建了一个线程,它使用全局变量的文本更新标签文本,并且每秒在标签上调用 setNeedsDisplay。但结果是一样的。我只看到某些变化,但不是全部。

一切都设置正确,标签永远不会是零。当我记录我的 updateMethod 时,一切似乎都很好。它只是没有显示!

干杯

这是我的线程的代码

- (void)startUpdateStatusThread{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
[self performSelectorOnMainThread:@selector(updateFrequently) withObject:nil waitUntilDone:NO];
[pool release];
}



- (void)updateFrequently{
NSLog(@"updateFrequently: %@", currentStatus);
test++;
[self.statusLabel setText:[NSString stringWithFormat:@"%@ - %i", currentStatus, test]];
[self.statusLabel setNeedsDisplay];
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self   selector:@selector(updateFrequently) userInfo:nil repeats:NO];
}
4

3 回答 3

3

如果我假设您调用标签的文本属性以及setNeedsDisplay从解析您的网站的“线程”中调用,我是对的吗?

请注意:对 UIViews(或 UIView 的子类,如您的标签)的更改必须在主线程上执行。

我建议你做的是编写一个帮助方法来更新你的标签并调用 setNeedDisplay,从你的 Parser-Thread 调用中

[mainViewController performSelectorOnMainThread:@selector(yourUpdateLabelHelper:) withObject:nil waitUntilDone:NO];

那应该可以完成您的工作。

于 2010-08-11T14:23:58.483 回答
2

你提到线程。请注意,UIKit 控件(例如 UILabel)只能从主线程更新。确保您只是尝试从主线程设置标签的文本,然后验证您是否仍有问题。

编辑由于问题编辑:

首先,-setNeedsDisplay 只告诉视图下次刷新屏幕时它需要重新显示,此时并不强制显示。

其次,iPhone 屏幕的绘制频率约为 60 赫兹。这意味着每 0.016666 秒左右会有一次更新。您正在尝试以比这更快的速度进行更新,因此实际上只会显示大约每 160 次的更新。

第三,可能也是最重要的一点,您似乎没有创建任何线程,除非您从后台线程调用 -startUpdateStatusThread。无论哪种方式,一旦你点击 -updateFrequently 一切都会回到主线程。使用您正在调度该计时器的频率,您可能会使 CPU 过载并导致系统没有时间绘制标签。因此,即使您正在设置新文本,也没有给它渲染的机会。您需要减少该计时器的频率,并且您可能需要重新考虑您正在尝试做的任何事情。

于 2010-08-11T14:21:29.020 回答
1

我认为定时器的创建应该在单独的函数中:允许重复并将定时器存储在一个成员变量中,你可以在 dealloc 上关闭。[NSTimer scheduleTimerWithTimeInterval:0.0001 target:self 选择器:@selector(updateFrequently) userInfo:nil repeats:YES]; }

更新函数应作为回调函数运行。

问候阿萨亚格

于 2010-08-11T16:10:40.300 回答