Sobes.tech
Middle+

Kontrolçünün yüklənməsini qarşısını almaq üçün MVC memarlığını necə istifadə etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

iOS-də MVC (Model-View-Controller) tez-tez "qalın" nəzarətçilərə səbəb olur, çünki biznes məntiqi və təqdimat məntiqi onlarda yerləşdirilir. Bu problemi həll etmək üçün aşağıdakı yanaşmalardan istifadə etmək olar:

  • Təqdimat məntiqini View-ə köçürün: Xüsusi UIView və ya cədvəl/kollekciya hüceyrələri yaradın, onlar məlumatların göstərilməsi və istifadəçinin əsas hərəkətlərinin işlənməsi üçün məsuliyyət daşıyır (məsələn, hüceyrə daxilində düymələrin basılması). Nəzarətçi yalnız View-i lazımi məlumatlarla konfiqurasiya edir.

    class MyCustomView: UIView {
        private let label = UILabel()
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            addSubview(label)
            // constraints və s. tənzimləmələr
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func configure(with text: String) {
            label.text = text
        }
    
        // UIControlEvents hadisələrinin işlənməsi, məsələn addTarget vasitəsilə
    }
    
  • Biznes məntiqini Model və ya ayrıca Service obyektlərinə köçürün: Xüsusi əməliyyatlar üçün məsul olan siniflər yaradın (məsələn, şəbəkə ilə işləmək, verilənlər bazası, məlumatların doğrulanması). Nəzarətçi bu tapşırıqları bu obyektlərə həvalə edir.

    class UserService {
        func fetchUsers(completion: @escaping ([User]?, Error?) -> Void) {
            // Şəbəkə sorğusu məntiqi
        }
    }
    
    class ProfileViewController: UIViewController {
        private let userService = UserService()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userService.fetchUsers { users, error in
                // Göstərilən məlumatlara və ya səhvə əsasən UI-ni yeniləyin
            }
        }
    }
    
  • Data Source və Delegate protokollarını istifadə edin: UITableViewDataSource, UICollectionViewDataSource, UITableViewDelegate, UICollectionViewDelegate protokollarını ayrı siniflərdə həyata keçirin, nəzarətçi daxilində deyil. Nəzarətçi yalnız bu siniflərin nümunələrinə sahib olacaq.

    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
            // Məlumatların yüklənməsi və dataSource.update(users:) vasitəsilə ötürülməsi
        }
    }
    
  • Coordinator Pattern tətbiq edin: Ekranlar arasında naviqasiya üçün məsul olan ayrıca obyektlər yaradın. Nəzarətçilər yalnız növbəti addıma keçməli olduqlarını bilirlər, amma hansı nəzarətçinin növbəti olacağını bilmirlər.

    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()
            // delegate, dataSource və s. konfiqurasiya
            navigationController.pushViewController(usersVC, animated: false)
        }
    
        func showUserDetails(user: User) {
            let userDetailsVC = UserDetailsViewController(user: user)
            navigationController.pushViewController(userDetailsVC, animated: true)
        }
    }
    

Bu yanaşmalar nəzarətçinin yüklənməsini azaldır, onu daha "incə" edir və View-nin həyat dövrünü idarə etməyə və Model və View arasında qarşılıqlı əlaqəni koordinasiya etməyə yönəldir, bütün tətbiq məntiqini yerinə yetirmək yerinə.