gpt4 book ai didi

ios - 带有 UI 回调的循环 block

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:14:31 25 4
gpt4 key购买 nike

我有一个耗时的过程,并且有一个进度指示器向用户显示事情已经进行了多长时间。因为我必须在主线程上执行消费操作,所以我无法选择在更新之间简单地在主队列上分派(dispatch)更新。我必须暂时切换到后台线程,以便在切换回并继续之前让 UI 更新。

我有的就是这个,但是感觉很不正统。有没有更好的方法来执行我所缺少的“带有 UI 回调的循环 block ”?我也不完全确定这是否最终会释放 block ,但那是另一回事了。

__block NSUInteger i = 0;
__block dispatch_block_t obtainBlock;

obtainBlock = [^{
[self obtainAssetAtIndex:i];
progressView.progress += progressPerFile;
i++;
if (i < assets.count) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
usleep(500);
dispatch_async(dispatch_get_main_queue(), obtainBlock);
});
} else {
[self didImportGroup];
[obtainBlock release];
}
} copy];

dispatch_async(dispatch_get_main_queue(), obtainBlock);

最佳答案

想法太复杂了。当前设置:

  1. 做一件工作
  2. 将控制权交给后台线程
  3. 睡在后台
  4. 在主线程上安排下一个工作

你想做什么:

  1. 做一件工作
  2. 安排下一项工作

代码如下:

- (void)doWork
{
if (_assetIndex < assets.count) {
[self obtainAssetAtIndex:_assetIndex++];
progressView.progress += progressPerFile;
[self performSelector:@selector(doWork) withObject:nil afterDelay:0];
} else {
[self didImportGroup];
}
}

您根本不需要后台线程(尤其是当它一直在做的就是休眠时)。

关于ios - 带有 UI 回调的循环 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11667793/

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