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
UIViewvə 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,UICollectionViewDelegateprotokolları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ə.