首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用VIPER技术设置异步图像加载?

如何使用VIPER技术设置异步图像加载?
EN

Stack Overflow用户
提问于 2016-01-19 22:32:11
回答 1查看 1.6K关注 0票数 4

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

代码语言:javascript
复制
--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的边界之间也不存在任何结构。

您建议如何让UIImages的TableView进行异步调用,以便使用VIP下载映像(而不阻塞主线程)?我可以使调用模式像这样,但我对第4步感到困惑:

  1. VC -> interacterOutput.loadImage("someLink")
  2. Interacter ->完成获取图像的工作,并将UIimage发送给演示者
  3. 演示者-> UIImage已经是VC的正确格式,所以将信息传回VC。
  4. VC ->我应该如何最好地设置代码,以便使单元格知道它的图像已经准备好了?我不想重新加载整个tableView

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 03:50:01

您描述的场景不是毒蛇。在VIPER中,演示者处于视图和交互之间。您的描述更接近于干净斯威夫特,它的单向控制流从V到I到P。

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

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

一旦收到JSON中的对象列表,演示者就可以组装一个视图模型对象来表示这些对象。图像URL可以简单地表示为字符串而不是UIImage。

如果您在将视图模型对象传递回视图控制器之前等待获取所有这些图像,则您的UI虽然在技术上没有被阻塞,但在用户看到表视图中的内容之前,还需要等待很长时间。因此,我只需将图像URL传递给视图控制器。

视图控制器然后可以获取实际的图像本身,而不涉及交互者或演示者。出于性能考虑,它可以使用类似于SDWebImage的东西来获取和缓存图像。

并不是每件事都要经历贵宾周期。以下几点可能会有所帮助。

将业务逻辑看作是获取对象列表。一旦完成,业务逻辑就实现了。视图控制器可以选择向用户显示图像URL字符串,而不是实际图像。这当然是一种表示法,虽然并不常见。但是您的视图控制器选择将图像显示为UIImages。此显示仅为视图控制器的内部显示。这并不是你的业务逻辑。

您的视图控制器可以获取图像本身。它甚至可以要求一个自定义子视图来进行抓取。

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

我希望这有助于澄清毒蛇,清洁斯威夫特,VIP周期,以及什么是业务逻辑。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34888218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档