我只是在xcode上玩目标c,这可能看起来像一个愚蠢的问题,但这是我的代码块,它可以工作,但它不能工作我想要它。
int i = 10;
int x = 0;
do {
printf("Count is: %i\n", x);
NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
counting.text = Result;
x++;
usleep(1000000);
} while (x < i);
它只在循环结束时将标签更改为9,它打印到控制台正常,但它应该从0到9计数并在应用程序上显示它。 我想我需要todo多线程,但示例是在java中,所以我不能将它们应用于这种语言
答案 0 :(得分:2)
它没有更新,因为您正在阻止(使用usleep
)主线程,它执行所有绘图(以及触摸和任何其他UI交互)。您需要设置文本然后让主线程返回。你应该让这个线程设置延迟调用:
int i = 10;
int x = 0;
do {
printf("Count is: %i\n", x);
NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
[counting performSelector:@selector(setText:) withObject:Result afterDelay:x];
x++;
} while (x < i);
答案 1 :(得分:0)
你可以试试这个:
int i = 10;
int x = 0;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 0);
do {
NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
time = dispatch_time(time, (int64_t)(1.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
counting.text = Result;
});
x++;
} while (x < i);
正如评论中所提到的,这里还有很多其他事情你需要注意。 linked question有一些很好的信息。
答案 2 :(得分:0)
正如人们在评论中已经提到的,问题是因为usleep(1000000)
冻结了你的主线程,谁负责与UI的交互,包括更新它。
如果更改此行[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
的睡眠,此代码应该按预期工作,而无需使用其他线程:
int i = 10;
int x = 0;
do {
printf("Count is: %i\n", x);
NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
counting.text = Result;
x++;
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
} while (x < i);
答案 3 :(得分:0)
我更喜欢使用计时器而不是在主线程或任何其他线程中休眠。请检查一下这个问题