gpt4 book ai didi

iphone - 长时间操作延迟后自旋事件指示器

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

我正在开发一个带有 UITableView 的 iOS 应用程序,它会在某个阶段添加或删除它的一堆行。由于有大量行,此操作可能需要很长时间。但是,我无法轻易确定它是否需要很长时间。

仅当此操作需要很长时间时,我才想显示 UIActivityIndi​​cator(微调器)。我一直这样做的方法是开始冗长的操作,经过一些延迟(比如 0.5 秒)后,我们测试操作是否仍在运行,如果是,我们开始显示 UIActivityIndi​​cator。

如果您可以在后台线程中运行冗长的操作,这就没有问题。但是,这种特殊情况很棘手,因为冗长的操作 (deleteRowsAtIndexPaths:withRowAnimation:) 必须在主线程中运行(如果我在后台线程中运行此方法,当后台线程尝试更新 UI 时应用程序偶尔会崩溃)。

我最近尝试的是这样的:

- (void) manipulateTableView
{
stillBusy = YES;
[self performSelectorInBackground:@selector(waitBeforeShowingBusyIndicatorForView:) withObject:view];
.
.
.
[self performSelectorOnMainThread:@selector(deleteRowsAtIndexPathsWithRowAnimation:) withObject:args waitUntilDone:YES];
stillBusy = NO;
}

- (void) waitBeforeShowingBusyIndicatorForView:(UIView*) view
{
usleep((int) (BUSY_INDICATOR_DELAY * 1000000));
if (stillBusy)
[self performSelectorOnMainThread:@selector(showBusyIndicatorForView:) withObject:view waitUntilDone:NO];
}

因为 showBusyIndi​​catorForView: 操作 UI,它必须在主线程上调用,否则应用程序可能会崩溃。

当 deleteRowsAtIndexPaths:withRowAnimation: 耗时很长时,waitBeforeShowingBusyIndi​​catorForView: 中的延迟到期,performSelectorOnMainThread:... 方法被调用并立即返回。但是随后仅在对 deleteRowsAtIndexPaths:withRowAnimation: 的调用 完成后才调用 showBusyIndi​​catorForView: 方法,这违背了目的。

我想我明白为什么会这样。 deleteRowsAtIndexPaths:withRowAnimation: 方法在主循环的迭代中运行,并且在运行时,对 showBusyIndi​​catorForView: 的调用作为主循环的消息排队。只有在主循环完成执行 deleteRowsAtIndexPaths:withRowsAnimation: 之后,它才会轮询队列以获取下一条消息,然后开始执行 showBusyIndi​​catorForView:。

有没有办法让这个东西正常工作。是否可以中断主循环并使其立即执行 showBusyIndi​​catorForView:?

最佳答案

我突然想到了两个选项:

  1. 修改长时间运行的前台例程,将其分成多个 block ,重复将进程的每个步骤分别分派(dispatch)到主队列。并以您设计流程的方式进行,以便它分派(dispatch)慢速前台任务的每个部分,并且仅在前一部分完成时将下一步分派(dispatch)到主队列。 (不要只是为主队列排队大量进程。)这样,您就可以让微调器有机会在其他作业排队时与它们相吻合。如果您对删除进行动画处理,这可能是不可能的,但话又说回来,我无法想象执行单个 deleteRowsAtIndexPaths 会花那么长时间。

  2. 可能更好,如果更新需要这么长时间,我会问这是为什么。 deleteRowsAtIndexPaths 不应考虑这一点。具体来说,不要发出多个 deleteRowsAtIndexPaths,而是构建要删除的行的 NSMutableArray,然后在单个 UI 调用中删除它们。我刚刚删除了 998 行(包括它们的底层模型对象),这几乎是瞬间完成的。

如果可能的话,我会倾向于选项 2。

关于iphone - 长时间操作延迟后自旋事件指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346634/

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