gpt4 book ai didi

iphone - RunLoop 与 UITableView 锁定

转载 作者:行者123 更新时间:2023-11-29 04:52:55 26 4
gpt4 key购买 nike

我正在编写一个 iPad 应用程序,但遇到了 UI 响应/锁定问题。

我有一个带有项目的UITableView,当单击某个项目时,它会在互联网上显示并获取该项目并显示它。程序的其余部分(未显示)将使用下载的项目,因此一次只能下载一项。

获取该项目可能需要很长时间。在此期间,我希望用户仍然能够滚动 UITableView,但在下载上一个单击的项目之前无法选择任何内容。

我知道这可以使用线程、 block 和回调来完成,但现在我没有时间这样做(不可能的时间限制)。

我认为一种快速的方法是按顺序下载它并使用运行循环和一个像这样的两步过程的标志:

  1. 当用户单击表格单元格 didSelectRowAtIndexPath 时,我会在其中设置一个全局标志,然后调用下载方法来下载该项目。如果用户单击另一个项目(在下载完成之前),它将看到选中的标志并退出该功能而不下载任何内容。基本上是这样的:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    static BOOL alreadyInHere=FALSE;
    if (alreadyInHere) return;
    alreadyInHere=TRUE;
    ....
    downloadItem(...);
    ShowAndUseItem(...);
    alreadyInHere=FALSE;
    }

    这允许用户一次只能选择一项。

  2. 为了允许用户在长时间下载期间仍然能够滚动 UITableView,我在上面显示的 downloadItem(...) 方法中放入了一个运行循环,如下所示...

    -(void) downloadItem(....)
    {
    BOOL downloading=TRUE;
    callFunctionsToStartdownload(...); //
    while (downloading) {
    downloading=DownloadSomeBytes(...);
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, YES);
    }
    }

(1) 和 (2) 的结果是用户在顺序下载期间仍然可以滚动 UITableView,alreadyInHere 标志阻止他们选择某些内容并开始另一次下载。

这在大多数情况下都有效,但大约 50% 的情况下,在下载期间,UITableView 变得无响应(无法滚动到表中的其他项目),甚至在下载之后,当您单击一些使 UITableView 基本上锁定的东西。

我的问题是,我是否正确执行了 runLoop?

我知道还有其他方法可以做到这一点,但由于其他原因我现在必须使用这个通用方法。

谢谢

最佳答案

您不应尝试在 tableview didSelectRow 方法中下载或执行任何其他可能耗时较长的事件。设置异步下载后退出(返回)此 UI 方法,以免锁定 UI。

锁定同时下载仍然可以,但您需要小心在错误或超时后重置状态。

关于iphone - RunLoop 与 UITableView 锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8511492/

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