gpt4 book ai didi

ios - 如何重复循环 dispatch_after 语句?

转载 作者:可可西里 更新时间:2023-11-01 06:23:19 26 4
gpt4 key购买 nike

我想要一个包含 dispatch_after 语句的 for 循环。问题是 dispatch_after 调用似乎与 for 循环不一致。换句话说,我希望它仅在 dispatch_after block 中的语句执行后才开始 for 循环的下一次迭代。

我该怎么做?

用例

我想在屏幕上显示文字。传统上我每秒显示一个单词。但是根据单词的长度,我现在想用更长的时间显示更长的单词,用更少的时间显示更短的单词。我想呈现一个词,稍等片刻(取决于词的长度)然后呈现下一个词,稍等片刻,然后是下一个,等等。

最佳答案

每秒打印一位数字 0、1、2、3、4、5、6、7、8、9。

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL);
for (int i=0; i<10; i++) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(queue,^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1LL * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
NSLog(@"%d",i);
dispatch_sync(dispatch_get_main_queue(), ^{
// show label on screen
});
dispatch_semaphore_signal(semaphore);
});
});
}

如果您陈述了您的用例,也许还有其他方法可以完成您正在尝试做的事情。


你也可以提前累加延迟时间,然后发送所有 block 。

    (1) __block double delay = 0;
(2) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL);
(3) for (int i=0; i<10; i++) {
(4) delay += 1LL * NSEC_PER_SEC; // replace 1 second with something related to the length of your word
(5) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), queue, ^{
NSLog(@"%d",i);
(6) dispatch_sync(dispatch_get_main_queue(), ^{
// show label on screen
});
});
}
  1. 标记变量 __block 以便它可以在 block 内修改
  2. 掌握系统的预定义队列之一。队列包含许多依次执行的匿名代码片段(称为“ block ”)。
  3. 循环。
  4. 加一秒。您应该用其他东西替换那个 1 。例如,如果单词有 10 个字母,.10*[word length] 将导致 1 秒停顿。
  5. 在给定的“延迟”秒数后,将以下代码(又名“ block ”)放入“队列”。队列将自动运行您放入其中的代码块。这行就像在说,“延迟运行”。
  6. 任何时候你在后台(就像这里,因为“队列”可能在后台线程上运行)并且你想改变用户界面,你必须在主队列中运行代码,因为 UIKit 不是线程安全库(意思是,如果您从不同线程调用它,则无法正确运行)。

关于ios - 如何重复循环 dispatch_after 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19096557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com