Pekerja Arsitektur Swift Bersih

Halo pembaca!

Sebelumnya, kami memeriksa bagaimana siklus VIP diatur dan bagaimana melakukan transisi antara harga dan transfer data. Sekarang Anda perlu mencari cara untuk menurunkan Interactor kami dari logika yang meluap-luap dan mengambil sebagian darinya untuk digunakan kembali oleh adegan lain. Dan Pekerja akan membantu kami dengan ini. Topiknya cukup sederhana, tetapi penting untuk disebutkan.



Teori


Pekerja adalah kelas tambahan / struktur (jangan dikelirukan dengan layanan atau pembantu) yang tugasnya mengambil alih bagian dari logika bisnis Interactor . Jika metode dalam Interactor berkembang, maka sudah waktunya untuk mengeluarkan logika yang banyak di Worker . Dalam Clean Swift, mereka digunakan untuk bekerja dengan logika penyimpanan data, dengan jaringan, dengan masing-masing lapisan aplikasi, dan sebagainya. Dengan kata lain, semuanya tebal, tingkat rendah dan tidak terkait dengan logika bisnis aplikasi.

Pekerja dibagi menjadi dua jenis utama:

  1. Lokal yang hanya digunakan di dalam adegan.
  2. Global yang tersedia untuk semua pemandangan.

Pekerja Lokal ditempatkan langsung di dalam tempat kejadian dan diberi nama sesuai namanya - SceneNameWorker . Pekerja Global terletak di direktori root Pekerja dan diberi nama sesuai dengan subjek mereka. Pekerja Lokal juga dapat bertindak sebagai "dekorator di atas dunia", dengan logika yang diperluas untuk kebutuhan pemandangan.

Jika Anda menggunakan pemisahan proyek menjadi beberapa lapisan ( Presentasi , Logika Bisnis , Ketekunan , Logika Jaringan ), maka peran jembatan penghubung antara lapisan Presentasi dan Logika Bisnis dapat ditugaskan ke Pekerja . Dengan demikian, kami akan menurunkan Interactor , mendapatkan perilaku yang lebih mudah diprediksi, dan kemudahan penggunaan kembali.

Berlatih


Pekerjaan Pekerja yang akan kita pertimbangkan pada contoh bekerja dengan jaringan. Kami akan memiliki dua layar - yang pertama daftar pengguna ditampilkan, dan yang kedua daftar posting pengguna ini. Semua data akan diambil oleh API . Kami akan membagi tugas ini menjadi tiga Pekerja , dua lokal dan satu global, yang akan bertindak sebagai titik masuk bagi dua lainnya. Saya akan menyembunyikan implementasi metode sendiri dalam artikel, dan siapa pun yang ingin mencoba dalam praktek, akan ada tautan ke proyek yang selesai di akhir artikel.



Struktur proyek ini bukan referensi untuk bekerja dengan jaringan dan tidak mencerminkan bagaimana cara bekerja dengannya di Clean Swift . Semua ini dilakukan hanya untuk contoh yang baik tentang peran Pekerja lokal dan global.

Untuk memulai, buat Pekerja global - NetworkWorker . Tempatkan di direktori Workers , pada tingkat yang sama dengan direktori Scenes . Dalam contoh di bawah ini, ada metode sendRequest (to: params: completion) , yang akan umum bagi Pekerja lokal. Ia melakukan tugas rutin - membentuk tautan dari parameter, mengirim permintaan dan mengirimkan hasilnya hingga selesai .

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) { // ... } } 

Untuk adegan pertama, kita perlu mendapatkan daftar API dari semua pengguna. Untuk melakukan ini, kami membuat HomeWorker lokal yang akan mengonfigurasi parameter untuk memuat pengguna dan memanggil sendRequest (ke: params: selesai) di NetworkWorker dengan parameter ini. Sekarang di Interactor adegan , kita perlu memanggil fetchUsers (selesai :) dan mengirim data yang diterima untuk diproses ke Presenter .

Ketika Anda mengklik sel tabel dengan nama pengguna, kami akan melakukan transisi dan mentransfer pengguna yang dipilih ke adegan lain.

 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) { // ... } } 

Pada halaman dengan posting pengguna, kami membuat PostsWorker , tetapi hanya dengan metode fetchPosts (userId: selesai :) . Di dalamnya kami memberikan ID pengguna yang postingannya ingin Anda unduh. Dalam metode ini, kami membentuk parameter dan memanggil sendRequest (ke: params: completion) di NetworkWorker . Dan dengan cara yang sama seperti sebelumnya, kita memanggil metode fetchPosts (userId: selesai :) di Interactor adegan itu, meneruskan data yang diterima ke 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) { // ... } } 

Sekarang seluruh implementasi kami telah dipindahkan ke file terpisah yang dapat digunakan kembali, tanpa memuat logika bisnis di Interactor .

Kesimpulan


Meskipun Pekerja sangat sederhana dan tidak mengungkapkan pengetahuan tersembunyi tentang arsitektur, penggunaannya penting dalam Bersihkan Swift . Saat menulis Pekerja , jangan lupa tentang protokol, pola struktural, dan DI. Jika tidak, Anda akan dengan cepat membentuk kekacauan Pekerja , di mana segala sesuatu yang bisa diambil dikeluarkan berkeping-keping.

Itu saja. Terima kasih telah membaca sampai akhir, di bawah ini adalah tautan ke proyek lengkap.

Seri artikel


  1. Tinjauan Arsitektur Swift Bersih
  2. Router dan Passing Data dalam Arsitektur Swift Bersih
  3. Pekerja arsitektur Swift Bersih (Anda di sini)
  4. Pengujian unit dalam arsitektur Clean Swift
  5. Contoh arsitektur toko online sederhana Clean Swift

Tautan ke proyek
Bantuan dalam menulis artikel: Bastien

Source: https://habr.com/ru/post/id465991/


All Articles