- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
该应用程序的本质是一个 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
}
}
最佳答案
您描述的场景并不是 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/
该应用程序的本质是一个 UITableView,当用户向下滚动 tableView 时,它会在每一行上显示 UIImages。我应该如何在不破坏 VIPER 架构的情况下将图像加载到单元格中? --V
1 介绍 Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。目前Star 26.6k, 它支持以下特性: 设置默认值
VerCors 中的一个错误生成了一些银色,看起来像: field f: Int method test(n: Int, x: Ref) requires n == 100 requires acc(
这是我的config.yaml文件 server: port: 5000 这是我使用毒蛇解码的逻辑 type Configurations struct { Server ServerCo
在iOS VIPER项目中,每个模块都需要调用远程服务(例如刷新 token +检查用户登录)。实现这一需求的最佳实践是什么? 每个模块可以有多个交互器吗? 或者我们应该在每个模块(交互器)中实现相同
我在使用 viper 时遇到问题,我已经通过 viper 方法分配了变量,所以当我尝试在任何函数中获取值时,我得到的是空值。有谁知道为什么会这样?任何其他变量初始化工作正常,但 viper GetSt
我用毒蛇 https://github.com/spf13/viper用于在我的 GO 应用程序中管理项目配置,以及将配置值解码为结构体。 var config c.Configuration //
我正在寻找 go 和 https://github.com/spf13/viper 的配置解析器似乎强烈推荐。 我很惊讶地发现配置文件默认没有经过验证。 Viper 解析文件并从中提取请求的值,但我找
我有一个类似于以下的 yaml 文件: ComplexItemList: - Name: First Complex item Date: Whenever StructItemList:
在VIPER设计模式,Interactor 应该返回可能被多个演示者操作使用的所有信息,还是我应该为每个演示者设置一个单独的结构? 在我的例子中,我有一张显示地点的 map 。要显示这些地点,我需要从
我正在按照 VIPER 设计模式在 Swift 中构建应用程序。 VIPER 包含四个组件: 1) 查看2)线框3) 主持人4) 交互器 我的常量将出现在哪个组件中以及如何出现? 最佳答案 如果你的意
假设我们必须每 10 秒更新一次数据。我们应该在哪里创建/存储计时器,它会在 VIPER 架构中的什么地方触发相关方法?ViewController 应该这样做并通知演示者吗?还是 Presenter
作为初学者,我曾经在 ViewControllers 中执行转场。此外,Apple 鼓励这种方法,因为 UIViewController 有方法 performSegue 和 prepareForSe
我正在将我的项目更改为 VIPER 模式。 我的主要观点有很多观察者。我找不到应该将我的观察员放在 VIPER 中的什么位置。 因为我不想让我的观察者出现在视野中。以前我有单独的观察者类,当有通知时,
考虑到VIPER结构 我有两个模块,A 和 B。第一个模块 A,通过演示者,想要执行一个必须在模块 B 中完成的 Action ,所以告诉它的线框去做。问题是,谁负责实例化整个模块( View 、交互
我正在尝试使用 viper ( see viper docs ) 读取 yaml 配置文件。但是我看不到一种方法来读取问题类型下的 map 值序列。我尝试了各种 Get_ 方法但似乎没有人支持这一点。
我有一个 yaml 配置文件,其中包含我的程序的所有设置。例如: something: enabled: true 我正在使用 https://github.com/spf13/viper获取
我正在尝试从配置中获取一些名称未知的组(稍后会获取更多)。 我是 golang 的新手,有点吃力。我正在使用 Viper,因为它支持 yaml、json 和 toml。 json 配置: {
有没有办法从加载的配置文件中删除键/值对? viper.Set("key", nil) 不工作 最佳答案 尝试 delete(viper.Get("path.to.key").(map[string]
我注意到这可能是 viper 尝试解码为结构时的错误。为了更好地解释它,请考虑以下内容: 我有一个如下所示的 cli 命令 dd-cli submit-bug --name "Bug 1"--tag
我是一名优秀的程序员,十分优秀!