iOS
एमवीपी आर्किटेक्चर
खोज…
परिचय
एमवीपी एक वास्तुशिल्प पैटर्न है, जो मॉडल-व्यू-कंट्रोलर की व्युत्पत्ति है। यह तीन अलग-अलग घटकों द्वारा दर्शाया गया है: मॉडल, दृश्य और प्रस्तुतकर्ता। यह स्वचालित इकाई परीक्षण की सुविधा और प्रस्तुति तर्क में चिंताओं के पृथक्करण को बेहतर बनाने के लिए इंजीनियर था।
उदाहरणों में आपको एमवीपी पैटर्न के साथ निर्मित एक सरल परियोजना मिलेगी।
टिप्पणियों
अवयव:
- मॉडल एक इंटरफेस है जो डोमेन डेटा के लिए जिम्मेदार है (GUI में प्रदर्शित या अन्यथा कार्य किया जा सकता है)
- दृश्य प्रस्तुति परत (GUI) के लिए जिम्मेदार है
- प्रस्तुतकर्ता मॉडल और दृश्य के बीच "मध्यम-पुरुष" है। यह दृश्य पर किए गए उपयोगकर्ता के कार्यों पर प्रतिक्रिया करता है, मॉडल से डेटा को पुनर्प्राप्त करता है, और इसे दृश्य में प्रदर्शित करने के लिए प्रारूपित करता है
घटक कर्तव्यों:
नमूना | राय | प्रस्तुतकर्ता |
---|---|---|
DB परत के साथ संचार करता है | रेंडर डेटा | मॉडल के लिए क्वेरी करता है |
उचित घटनाओं को उठाना | घटनाओं को प्राप्त करता है | मॉडल से डेटा का प्रारूप |
बहुत बुनियादी मान्यता तर्क | दृश्य को स्वरूपित डेटा भेजता है | |
जटिल सत्यापन तर्क | ||
एमवीसी और एमवीपी के बीच अंतर :
- MVC में देखें नियंत्रक के साथ कसकर युग्मित किया गया है, MVP के दृश्य भाग में UIViews और UIViewDontroller दोनों शामिल हैं
- MVP व्यू जितना संभव हो उतना गूंगा है और इसमें लगभग कोई तर्क नहीं है (जैसे MVVM में), MVC व्यू में कुछ व्यावसायिक तर्क हैं और मॉडल को क्वेरी कर सकते हैं
- एमवीपी देखें उपयोगकर्ता के इशारों को संभालता है और एमवीसी में प्रस्तुतकर्ता के साथ बातचीत को नियंत्रित करता है, नियंत्रक इशारों को संभालता है और मॉडल को आदेशित करता है
- एमवीपी पैटर्न यूनिट परीक्षण का अत्यधिक समर्थन करता है, एमवीसी का सीमित समर्थन है
- एमवीसी नियंत्रक के पास बहुत से यूआईआईटी निर्भरताएं हैं, एमवीपी प्रस्तुतकर्ता के पास कोई नहीं है
पेशेवरों:
- MVP UIViewController को उस घटक का एक हिस्सा बनाता है जिसे वह गूंगा, निष्क्रिय और ... कम विशाल;]
- अधिकांश व्यावसायिक तर्क मूक दृश्यों के कारण बाधित हो जाते हैं, इससे एक उत्कृष्ट परीक्षा होती है। डोमेन भाग का परीक्षण करने के लिए नकली वस्तुओं को पेश किया जा सकता है।
- अलग-अलग संस्थाओं को सिर पर रखना आसान है, जिम्मेदारियां स्पष्ट रूप से विभाजित हैं।
विपक्ष
- आप अधिक कोड लिखेंगे।
- अनुभवहीन डेवलपर्स के लिए बाधा या उन लोगों के लिए जो अभी तक पैटर्न के साथ काम नहीं करते हैं।
Dog.swift
import Foundation
enum Breed: String {
case bulldog = "Bulldog"
case doberman = "Doberman"
case labrador = "Labrador"
}
struct Dog {
let name: String
let breed: String
let age: Int
}
DoggyView.swift
import Foundation
protocol DoggyView: NSObjectProtocol {
func startLoading()
func finishLoading()
func setDoggies(_ doggies: [DoggyViewData])
func setEmpty()
}
DoggyService.swift
import Foundation
typealias Result = ([Dog]) -> Void
class DoggyService {
func deliverDoggies(_ result: @escaping Result) {
let firstDoggy = Dog(name: "Alfred", breed: Breed.labrador.rawValue, age: 1)
let secondDoggy = Dog(name: "Vinny", breed: Breed.doberman.rawValue, age: 5)
let thirdDoggy = Dog(name: "Lucky", breed: Breed.labrador.rawValue, age: 3)
let delay = DispatchTime.now() + Double(Int64(Double(NSEC_PER_SEC)*2)) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delay) {
result([firstDoggy,
secondDoggy,
thirdDoggy])
}
}
}
DoggyPresenter.swift
import Foundation
class DoggyPresenter {
// MARK: - Private
fileprivate let dogService: DoggyService
weak fileprivate var dogView: DoggyView?
init(dogService: DoggyService){
self.dogService = dogService
}
func attachView(_ attach: Bool, view: DoggyView?) {
if attach {
dogView = nil
} else {
if let view = view { dogView = view }
}
}
func getDogs(){
self.dogView?.startLoading()
dogService.deliverDoggies { [weak self] doggies in
self?.dogView?.finishLoading()
if doggies.count == 0 {
self?.dogView?.setEmpty()
} else {
self?.dogView?.setDoggies(doggies.map {
return DoggyViewData(name: "\($0.name) \($0.breed)",
age: "\($0.age)")
})
}
}
}
}
struct DoggyViewData {
let name: String
let age: String
}
DoggyListViewController.swift
import UIKit
class DoggyListViewController: UIViewController, UITableViewDataSource {
@IBOutlet weak var emptyView: UIView?
@IBOutlet weak var tableView: UITableView?
@IBOutlet weak var spinner: UIActivityIndicatorView?
fileprivate let dogPresenter = DoggyPresenter(dogService: DoggyService())
fileprivate var dogsToDisplay = [DoggyViewData]()
override func viewDidLoad() {
super.viewDidLoad()
tableView?.dataSource = self
spinner?.hidesWhenStopped = true
dogPresenter.attachView(true, view: self)
dogPresenter.getDogs()
}
// MARK: DataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dogsToDisplay.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
let userViewData = dogsToDisplay[indexPath.row]
cell.textLabel?.text = userViewData.name
cell.detailTextLabel?.text = userViewData.age
return cell
}
}
extension DoggyListViewController: DoggyView {
func startLoading() {
spinner?.startAnimating()
}
func finishLoading() {
spinner?.stopAnimating()
}
func setDoggies(_ doggies: [DoggyViewData]) {
dogsToDisplay = doggies
tableView?.isHidden = false
emptyView?.isHidden = true;
tableView?.reloadData()
}
func setEmpty() {
tableView?.isHidden = true
emptyView?.isHidden = false;
}
}
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow