在不阻塞主线程的情况下在 100 多个 UIButton 上设置动画进度

Animate progress on 100s of UIButtons without blocking main thread

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

目前,会话委托是管理单元的UIViewController。于是session调用delegate .URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:周期性的通知delegate向server发送内容的进度

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

每次调用委托方法时,这种方法都会强制我找到按钮。这似乎是间接的,我想知道是否有更好的方法来做到这一点——可能有 100 个按钮如此担心运行时间。

我正在考虑让按钮成为会话委托,但这与 MVC 背道而驰,按钮引用可能会在 table 视图中消失或更改,从而导致未定义的行为(尽管它只对更新实际在内存中的按钮)。

there could be 100s of buttons

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

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