Sobes.tech
Middle+

Kontrolchini ortiqcha yuklamasligini oldini olish uchun MVC arxitekturasidan qanday foydalanish mumkin?

sobes.tech AI

AIdan javob

iOS'da MVC (Model-Görünüm-Boshqaruvchi) ko'pincha ularning ichida biznes-mantiq va taqdimot mantigini joylashtirish sababli "qalin" boshqaruvchilarga olib keladi. Bu muammoni hal qilish uchun quyidagi yondashuvlar qo'llanilishi mumkin:

  • Taqdimot mantigini View ga tashqariga chiqarish: Ma'lumotlarni ko'rsatish va oddiy foydalanuvchi harakatlarini (masalan, tugmalar bosilishi) boshqaradigan maxsus UIView yoki jadval/kollektsiya hujayralarini yaratish. Boshqaruvchi faqat View'ni kerakli ma'lumotlar bilan sozlaydi.

    class MyCustomView: UIView {
        private let label = UILabel()
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            addSubview(label)
            // Constraints va boshqa sozlamalar
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func configure(with text: String) {
            label.text = text
        }
    
        // UIControlEvents voqealarini, masalan, addTarget orqali, boshqarish
    }
    
  • Biznes-mantiqni Model yoki alohida Service obyektlariga tashqariga chiqarish: Maxsus operatsiyalar uchun javobgar bo'lgan sinflar yaratish (masalan, tarmoq bilan ishlash, ma'lumotlar bazasi, ma'lumotlarni tekshirish). Boshqaruvchi bu vazifalarni bu obyektlarga topshiradi.

    class UserService {
        func fetchUsers(completion: @escaping ([User]?, Error?) -> Void) {
            // Tarmoq so'rovi mantig'i
        }
    }
    
    class ProfileViewController: UIViewController {
        private let userService = UserService()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userService.fetchUsers { users, error in
                // Olingan ma'lumotlar yoki xatoga asoslangan UI yangilash
            }
        }
    }
    
  • Data Source va Delegate protokollaridan foydalanish: UITableViewDataSource, UICollectionViewDataSource, UITableViewDelegate, UICollectionViewDelegate protokollarini alohida sinflarda amalga oshirish, boshqaruvchida emas. Boshqaruvchi faqat bu sinflarning instansiyalariga ega bo'ladi.

    class UsersTableViewDataSource: NSObject, UITableViewDataSource {
        private var users: [User] = []
    
        func update(users: [User]) {
            self.users = users
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return users.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath)
            let user = users[indexPath.row]
            cell.textLabel?.text = user.name
            return cell
        }
    }
    
    class UsersViewController: UIViewController {
        @IBOutlet weak var tableView: UITableView!
        private let dataSource = UsersTableViewDataSource()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            tableView.dataSource = dataSource
            // Ma'lumotlarni yuklash va dataSource.update(users:) ga o'tkazish
        }
    }
    
  • Koordinator Patternni qo'llash: Ekranlar o'rtasida navigatsiya qilish uchun alohida obyektlar yaratish. Boshqaruvchilar faqat keyingi bosqichga o'tish kerakligini biladi, lekin qaysi boshqaruvchi keyingi bo'lishini bilmaydi.

    protocol AppCoordinator: AnyObject {
        func start()
        func showUserDetails(user: User)
    }
    
    class MainAppCoordinator: AppCoordinator {
        private let navigationController: UINavigationController
    
        init(navigationController: UINavigationController) {
            self.navigationController = navigationController
        }
    
        func start() {
            let usersVC = UsersViewController()
            // Delegat, dataSource va boshqalarni sozlash
            navigationController.pushViewController(usersVC, animated: false)
        }
    
        func showUserDetails(user: User) {
            let userDetailsVC = UserDetailsViewController(user: user)
            navigationController.pushViewController(userDetailsVC, animated: true)
        }
    }
    

Ushbu yondashuvlar boshqaruvchini yukini kamaytiradi, uni "yog'ini" kamaytiradi va View ning hayot aylanishini boshqarish va Model bilan View o'rtasidagi o'zaro ta'sirni muvofiqlashtirishga qaratilgan, butun ilova mantig'ini bajarish o'rniga.