【问题标题】:Animate progress on 100s of UIButtons without blocking main thread在不阻塞主线程的情况下为 100 个 UIButtons 设置动画进度
【发布时间】:2019-09-10 14:17:07
【问题描述】:

我有一个UITableView,最多有几百个单元格(并非一次全部可见)。每个单元格都包含一个UIButton,其中包含一种指示上传进度的方法。 URLSession 在后台任务中执行上传。

目前,会话委托是管理单元的UIViewController。因此,会话调用 delegate .URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: 定期通知代理向服务器发送内容的进度。

在委托方法中,我找到了与此任务关联的UIButton,并为新的进度设置动画(我可以找到按钮,因为我制作了button.identifier = task.identifier)。

这种方法迫使我在每次调用委托方法时都找到按钮。这似乎是间接的,我想知道是否有更好的方法来做到这一点 - 可能有 100 多个按钮非常担心运行时间。

我正在考虑让按钮成为会话委托,但这与 MVC 相违背,并且按钮引用可能会在表格视图中消失或更改,从而导致未定义的行为(尽管只更新实际在记忆)。

【问题讨论】:

    标签: ios model-view-controller uiviewcontroller


    【解决方案1】:

    可能有 100 个按钮

    不,不可能。没有出现在屏幕上的单元格根本不存在(因为单元格在表格视图中被重复使用)。因此,您只需要担心在任何时候实际可见的单元格。请参阅 UITableView visibleCellsindexPathsForVisibleRows。因此,即使您的方法不是非常有效,它也不是非常低效。

    但是,正确的方法是使用上传任务提供的progress 对象。当上传开始时,告诉单元格或按钮或其他任何东西开始使用键值观察观察progress 对象的fractionCompleted。现在,单元格或按钮或任何与该任务直接接触的东西,并且每次听到fractionCompleted 已更改时都可以自行更新。当单元格停止显示时,停止观察。它还有一些其他功能(即,当相应的任务已经在进行中时,应对重复使用的单元格滚动到屏幕上),但这就是您想要的基本架构。

    【讨论】:

    • 我可以想象屏幕上可能有 100 个按钮的位置(或者您想要更新 100 个视图的位置),但我明白您的意思。谢谢!
    • 对,但重点是,即使有 10000 个按钮,我描述的方式也是完全有效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多