gpt4 book ai didi

iOS - 如何在设定的时间后中断异步后台操作

转载 作者:行者123 更新时间:2023-11-28 19:03:42 25 4
gpt4 key购买 nike

注意:请不要评论这是否是个好主意;)我只是在试验所以想看看结果如何...

我有一个 UITextView 和一些 inputText,我要将其设置为 UITextView 的文本。

我想尝试以视觉方式将 inputText 滴入 TextView ,比如说,一次一个字母或一个单词。

例如(不考虑滴灌延迟或执行线程):

for (NSInteger i = 0; i < inputText.length; i++) {
NSString* charAtIndex = [text substringWithRange:NSMakeRange(i, 1)];
_textView.text = [NSString stringWithFormat:@"%@%@", _textView.text, charAtIndex];
}

因此,要构建延迟并查看添加的字符(或单词),一次一个,我可以执行以下操作:

dispatch_queue_t backgroundQueue = dispatch_queue_create("background_queue", 0);
for (NSInteger i = 0; i < inputText.length; i++) {
dispatch_async(backgroundQueue, ^{
[NSThread sleepForTimeInterval:0.01f];
NSString* charAtIndex = [inputText substringWithRange:NSMakeRange(i, 1)];
dispatch_async(dispatch_get_main_queue(), ^{
_textView.text = [NSString stringWithFormat:@"%@%@", _textView.text, charAtIndex];
});
});
}

一切正常,正如预期的那样,for 循环正在后台队列中排队一堆异步操作。

但我希望以上内容作为更大的、单一的同步可视化的一部分发生。在添加此代码以滴灌 UITextView 之前,我只是在 UITextView 中设置文本,然后为当前 View 设置动画(包括 UITextView ) 屏幕外。都在主线程上。用户会点击一个按钮,看到整个文本出现,然后 View 开始动画离开屏幕,马上。然后,用户继续进行工作流程中的下一步。

我正在尝试滴灌可视化,给人一种 TextView 一次填充一个字符(或单词)的印象,但我不希望用户必须等到每个最后一个字符/单词已添加。因此,我希望看到 UITextView 被填充,例如 0.3 或 0.5 秒,然后再开始为 View (包括 UITextView)设置动画的动画-屏幕…

所以它有点像这样:

dispatch_queue_t backgroundQueue = dispatch_queue_create("background_queue", 0);
for (NSInteger i = 0; i < inputText.length; i++) {
dispatch_async(backgroundQueue, ^{
[NSThread sleepForTimeInterval:0.01f];
NSString* charAtIndex = [inputText substringWithRange:NSMakeRange(i, 1)];
dispatch_async(dispatch_get_main_queue(), ^{
_textView.text = [NSString stringWithFormat:@"%@%@", _textView.text, charAtIndex];
});
});
}

// ...
// Animate the view (including the UITextView) off screen
// ...
// User continues with the main workflow

现在,由于所有滴灌在后台异步发生,一旦我添加代码以动画化 View ,您就会错过视觉滴灌。主线程一直运行到为屏幕外的 View 设置动画。

我不确定如何实现我想要的?

我是否以某种方式中断了上述循环?检查从另一个线程更新的标志?

我不能在主线程上等待 - 因为它会阻止对 UITextView 的滴灌更新......

有什么建议吗?

最佳答案

您可以延迟动画以“给”滴灌时间,如下所示:

double delayInSeconds = 0.5f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// ...
// Animate the view (including the UITextView) off screen
// ...
});

这样用户将看到 0.5 秒的点滴动画。这是 GCD 版本,但您也可以使用该方法:

[UIView animateWithDuration:0.3f // Set your duration here
delay:0.5f
options:UIViewAnimationOptionCurveEaseOut // Choose the right option here
animations:^{
// Do your animations here.
}
completion:^(BOOL finished){
if (finished) {
// Do your method here after your animation.
}
}];

关于iOS - 如何在设定的时间后中断异步后台操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22456371/

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