调用 sleep(5); 和更新文本字段不起作用

6
我正在尝试睡眠一个方法(见下文),但是不是像myTextLabelString的值被更改,等待5秒钟,然后更改为“休眠5工作”,等待5秒钟,最后更改为“第二次休眠5工作”.... 它只是从myTextLabelString的值开始,等待10秒钟,然后才更改为“第二次休眠5工作”。
- (void)textLabelChanger:(id)sender {

    NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown];    

    textLabel.text=myTextLabelString;
    sleep(5);
    textLabel.text=@"sleep 5 worked";
    sleep(5);
    textLabel.text=@"sleep 5 worked second time round";
    return;
}

6
实际上,它能够正常工作;只是因为您没有掌握 runloop 是什么,所以它没有做到您认为应该做到的事情。 - Dave DeLong
还可以查看几小时前的答案,关于NSTextField等待循环结束才更新 - jscs
4个回答

10

这可能会提供您所寻求的结果:

-(void)textLabelChanger:(id)sender
{
    NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown];    
    textLabel.text=myTextLabelString;

    [self performSelector:@selector(updateTextLabelWithString:) withObject:@"sleep 5 worked" afterDelay:5.0];
    [self performSelector:@selector(updateTextLabelWithString:) withObject:@"sleep 5 worked second time round" afterDelay:10.0];
}

-(void)updateTextLabelWithString:(NSString*)theString
{
    textLabel.text=theString;
}

有很多种方法可以做到这一点。你不需要使用sleep()方法,而是可以使用两个不同的方法:doFirstTextUpdatedoSecondTextUpdatedoFirstTextUpdate会先写入“sleep 5 worked”,然后再使用相同的[self performSelector:]技术,在另外五秒的延迟后调用另一个选择器doSecondTextUpdate

在Objective-C中,使用sleep()方法的情况非常罕见。

-(void)textLabelChanger:(id)sender
{
    NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown];    
    textLabel.text=myTextLabelString;

    [self performSelector:@selector(firstUpdate) withObject:nil afterDelay:5.0];
}
-(void)firstUpdate
{
    textLabel.text = @"sleep 5 worked";
    [self performSelector:@selector(secondUpdate) withObject:nil afterDelay:5.0];
}
-(void)secondUpdate
{
    textLabel.text = @"sleep 5 worked second time round";
}

哇,太感谢了!终于解开了理解如何像在C语言中一样进行线程的心理障碍 :) 干杯,这个完美地起作用了。 - buzzkip
1
这实际上与线程无关。它只是在一定时间后安排某些东西被运行(由运行循环)。如果某些东西阻塞了主线程10秒钟(比如调用sleep方法),它将等待直到完成才会运行。 - crimson_penguin

3

通常情况下,对UIKit组件的更改只有在退出回路后才会生效。由于您从未故意阻塞主线程(我假设您的代码只是一个睡眠测试,而不是您真正想要执行的操作),因此这通常不是问题。

如果您真的想验证睡眠是否起作用,请尝试使用NSLog替换'text'属性的设置(所有日志都有时间戳)。如果您希望在暂停后在主线程上发生某些事情,请使用performSelector:afterDelay:


2
这是几乎所有 GUI 编程工具包都会出现的经典问题。如果您在事件处理线程上休眠,那么该线程将被绑定,无法更新屏幕。如果您需要进行定期更新屏幕的持续性工作,则必须在单独的线程中进行;这就是您在此处需要做的。

2

如前所述,阻塞主线程可能不是您想要做的事情。不要试图让您的应用程序停止做任何事情,包括重新绘制屏幕或响应触摸操作,而是从不同的角度考虑问题。创建一个NSTimer,在未来5秒内安排一个方法调用,并在等待计时器触发时让您的应用程序继续运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接