gpt4 book ai didi

viper-architecture - 如何使用 VIPER 架构设置异步图像加载?

转载 作者:行者123 更新时间:2023-12-04 07:56:31 28 4
gpt4 key购买 nike

该应用程序的本质是一个 UITableView,当用户向下滚动 tableView 时,它会在每一行上显示 UIImages。我应该如何在不破坏 VIPER 架构的情况下将图像加载到单元格中?

--VC code--

func cellForRowAtIndexPath...... {
var cell = dequeueCellWithIdentifier.....

//Method 1
cell.image = outputInteracter.loadImage("someHttpImageLink")

//Method 2. - using a completion block
outputInteracter.loadImage(anImage -> {
cell.image = anImage
}
}

上述两种方法似乎都打破了 VIP,因为没有涉及演示者,并且没有结构在 V-I-P 的边界之间传递

你会如何建议让 TableView 的 UIImages 使用 VIP 进行异步调用以下载图像(不阻塞主线程)?我可以使调用模式像这样,但我对第 4 步感到困惑:
  • VC -->interacterOutput.loadImage("someLink")
  • Interacter --> 完成获取图像的工作,并将 UIimage 发送给演示者
  • Presenter --> UIImage 已经是 VC 的正确格式,所以将信息传回 VC
  • VC --> 我应该如何最好地设置代码,以便单元知道它的图像已准备好?我不想重新加载整个 tableView

  • 任何帮助将不胜感激。

    最佳答案

    您描述的场景并不是 VIPER 。在 VIPER 中,演示者位于 View 和交互者之间。您的描述更接近 Clean Swift,它具有从 V 到 I 再到 P 的单向控制流。

    假设您的问题是针对 Clean Swift,您首先需要清楚业务逻辑是什么。在不知道您的应用程序的详细信息的情况下,我只能假设您首先要求交互者获取 JSON 中的对象列表。每个对象都有一个指向某处图像的链接,然后您必须单独获取该图像。

    如果我的假设是正确的,那么获取这些单独的图像不是业务逻辑。它只是业务逻辑的一部分。业务逻辑是首先获取对象列表。

    一旦以 JSON 格式接收到对象列表,您的演示者就可以组装一个 View 模型对象来表示这些对象。图像 URL 可以简单地表示为 String 而不是 UIImage。

    如果在将 View 模型对象传回 View Controller 之前等待获取所有这些图像,您的 UI 虽然在技术上没有被阻止,但在用户看到表格 View 中的内容之前将有很长时间的等待。因此,我会简单地将图像 URL 传递给 View Controller 。

    然后 View Controller 可以在不涉及交互者或演示者的情况下自行获取实际图像。出于性能原因,它可以使用类似 SDWebImage 的东西来获取和缓存图像。

    并非所有事情都必须经过 VIP 周期。以下内容可能会有所帮助。

    将业务逻辑视为获取对象列表。一旦完成,业务逻辑就完成了。 View Controller 可以选择向用户显示图像 URL 字符串,而不是实际图像。这当然是一种表现形式,尽管并不常见。但是您的 View Controller 选择将图像显示为 UIImages。此显示仅在 View Controller 内部。这实际上不是您的业务逻辑。

    您的 View Controller 可以自己获取图像。它甚至可以要求自定义 subview 进行获取。

    如果您要通过 VIP 周期单独获取图像,则问题中的一个子问题是关于不重新加载表 View 。我不建议这样做。但是如果您的对象列表实际上只是一个图像列表,如在相册集合 View 中,这可能是必要的。我会将图像 URL、请求对象中的行/列数据嵌入到交互器中。当异步返回图像时,我已经知道该图像将显示在哪一行和哪列。只需将其传递给演示者,然后查看 Controller 。然后 View Controller 可以重新加载单个单元格而不是整个表格或集合 View 。

    我希望这有助于澄清 VIPER、Clean Swift、VIP 周期以及什么是业务逻辑。

    关于viper-architecture - 如何使用 VIPER 架构设置异步图像加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888218/

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