该应用程序的本质是一个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的边界之间也不存在任何结构。
您建议如何让UIImages的TableView进行异步调用,以便使用VIP下载映像(而不阻塞主线程)?我可以使调用模式像这样,但我对第4步感到困惑:
任何帮助都将不胜感激。
发布于 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周期,以及什么是业务逻辑。
https://stackoverflow.com/questions/34888218
复制相似问题