干净迅速的建筑工人

读者好!

之前,我们研究了VIP周期的安排方式以及如何在价格和数据传输之间进行转换。 现在,您需要弄清楚如何从过多的逻辑中卸载我们的Interactor ,并取出其中的一部分以供其他场景重用。 工人们将为此提供帮助。 该主题的规模不大,但值得一提。



理论


工人是辅助类/结构(不要与服务或帮助程序混淆),其任务是接管Interactor的业务逻辑的一部分。 如果Interactor中的方法正在扩展,那么该抽出Worker中大量逻辑的时候了。 在Clean Swift中,它们用于处理数据存储逻辑,网络,应用程序的各个层等。 换句话说,一切都是庞大,低级的,并且与应用程序的业务逻辑无关。

工人分为两种主要类型:

  1. 仅在场景内部使用的本地
  2. 全局可用于任何场景。

本地工人直接放置在场景内部,并以她的SceneNameWorker命名。 全局工作程序位于“ 工作程序”根目录中,并根据其主题进行命名。 本地工人还可以充当“全球装饰师”,并根据现场需求扩展逻辑。

如果将项目分为多个层( 表示业务逻辑持久性网络逻辑 ),则可以将表示层和业务逻辑之间的连接桥的角色分配Workers 。 因此,我们将卸载Interactor ,获得更可预测的行为并易于重用。

练习


我们将在使用网络的示例中考虑工人的工作。 我们将有两个屏幕-第一个屏幕显示用户列表,第二个屏幕显示该用户的帖子列表。 所有数据将由API获取 。 我们将把这个任务分为三个工人 ,两个是本地的,一个是全局的,这将作为另外两个的入口。 我将在文章中隐藏这些方法的实现,无论谁想在实践中尝试一下,在文章末尾都将有一个指向完成的项目的链接。



该项目结构不是使用网络的参考,也没有以任何方式反映在Clean Swift中如何使用它。 所有这些仅是作为本地和全球工人角色的一个很好的例子而完成的。

首先,创建一个全局Worker - NetworkWorker 。 将其放置在与Scenes目录相同级别的Workers目录中。 在下面的示例中,有一个sendRequest(to:params:complete)方法,该方法对于local Workers是通用的。 它执行例行任务-从参数形成链接,发送请求并将结果发送到完成

struct NetworkWorker { // MARK: - Private Properties private let session = URLSession.shared // MARK: - Public Methods ///  Worker.    API /// /// - Parameters: /// - to: ,     /// - params:    /// - completion:     func sendRequest(to: URL, params: [String: String], completion: @escaping (Data?, Error?) -> Void) { // ... } } 

对于第一个场景,我们需要获取所有用户的API列表。 为此,我们创建一个本地HomeWorker ,它将配置用于加载用户的参数,并使用这些参数在NetworkWorker中调用sendRequest(以:params:completion) 。 现在,在场景的Interactor中,我们需要调用fetchUsers(completion :)并将接收到的数据发送给Presenter进行处理。

当您单击具有用户名的表格单元格时,我们将进行转换并将所选用户转移到另一个场景。

 struct HomeWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let usersURL = URL(string: "https://jsonplaceholder.typicode.com/users") // MARK: - Public Methods ///  Worker.   API     /// /// - Parameter complete:     func fetchUsers(_ complete: @escaping ([User]?) -> Void) { // ... } } 

在包含用户帖子的页面上,我们创建PostsWorker ,但仅使用fetchPosts(userId:completed :)方法。 在其中,我们传递您要下载其帖子的用户的ID。 在该方法中,我们形成参数并在NetworkWorker中调用sendRequest(至:params:完成) 。 并且以与之前相同的方式,我们在场景的Interactor中调用fetchPosts(userId:completed :)方法,将接收到的数据传递给Presenter

 struct PostsWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let postsURL = URL(string: "https://jsonplaceholder.typicode.com/posts") // MARK: - Public Methods ///   API      /// /// - Parameters: /// - userId: ID ,     /// - completed:     func fetchPosts(userId: Int, _ completed: @escaping ([Post]?) -> Void) { // ... } } 

现在,我们的整个实现已移至可以重用的单独文件,而无需在Interactor中加载业务逻辑。

结论


尽管Workers非常简单,并且不会透露任何有关体系结构的隐藏知识,但是在Clean Swift中 ,它们的使用很重要。 在编写Workers时 ,请不要忘记协议,结构模式和DI。 否则,您将很快形成一个混乱的Workers ,其中所有可以取出的东西都被分割成碎片。

仅此而已。 感谢您阅读全文,以下是完整项目的链接。

系列文章


  1. Clean Swift体系结构概述
  2. Clean Swift体系结构中的路由器和数据传递
  3. Clean Swift架构的工作人员(您在这里)
  4. Clean Swift架构中的单元测试
  5. 一个简单的在线商店架构Clean Swift的示例

链接到项目
撰写文章的帮助: Bastien

Source: https://habr.com/ru/post/zh-CN465991/


All Articles