如何在 Swift 中实现简单的 MVC 设计模式?
How to implement simple MVC design pattern in Swift?
我是 MVC 设计模式的新手。我创建了 "DataModel" 它将调用 API,创建数据,并使用委派将 return 数据发送到 ViewController,"DataModelItem" 将保存所有数据。 如何在 "requestData" 函数 中调用 DataModel 初始化函数。这是我的代码:
protocol DataModelDelegate:class {
func didRecieveDataUpdata(data:[DataModelItem])
func didFailUpdateWithError(error:Error)
}
class DataModel: NSObject {
weak var delegate : DataModelDelegate?
func requestData() {
}
private func setDataWithResponse(response:[AnyObject]){
var data = [DataModelItem]()
for item in response{
if let tableViewModel = DataModelItem(data: item as? [String : String]){
data.append(tableViewModel)
}
}
delegate?.didRecieveDataUpdata(data: data)
}
}
对于 DataModelItem:
class DataModelItem{
var name:String?
var id:String?
init?(data:[String:String]?) {
if let data = data, let serviceName = data["name"] , let serviceId = data["id"] {
self.name = serviceName
self.id = serviceId
}
else{
return nil
}
}
}
控制器:
class ViewController: UIViewController {
private let dataSource = DataModel()
override func viewDidLoad() {
super.viewDidLoad()
dataSource.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
dataSource.requestData()
}
}
extension ViewController : DataModelDelegate{
func didRecieveDataUpdata(data: [DataModelItem]) {
print(data)
}
func didFailUpdateWithError(error: Error) {
print("error: \(error.localizedDescription)")
}
}
我建议为 DataModel 使用单例实例,因为这将是一个 class 您将从应用程序中的许多点调用。
您可以在以下位置参考其文档:
Managing Shared resources using singleton
有了这个,您将不需要在每次需要访问数据时都初始化此 class 实例。
How to implement simple MVC design pattern in Swift?
作为通用答案,在 iOS 开发中,您已经在隐式执行此操作!处理故事板意味着 view 层并控制它们如何工作的逻辑以及它们如何连接到 model 是通过创建来完成的查看控制器,这是默认流程。
对于您的情况,让我们澄清一点:根据标准 MVC,默认情况下调用 api 的负责层在逻辑上应该是视图控制器。然而,出于模块化、可重用性和避免创建大量视图控制器的目的,我们可以遵循您模仿的方法,这并不意味着它的模型责任,我们可以将其视为辅助辅助层(例如 MVC-N ),这意味着(根据您的代码)DataModel
是 而不是 模型,它是 "networking" 层,而 DataModelItem
是实际模型。
How to call a DataModel init function in "requestData" function
在我看来,它并没有引起轰动。您需要的是来自 DataModel
的实例,因此您可以调用所需的方法。
在视图控制器中:
let object = DataModel()
object.delegate = self // if you want to handle it in the view controller itself
object.requestData()
我只是在这里分享我的答案,我使用的是可编码的。它对任何人都有用:
型号:
import Foundation
struct DataModelItem: Codable{
struct Result : Codable {
let icon : String?
let name : String?
let rating : Float?
let userRatingsTotal : Int?
let vicinity : String?
enum CodingKeys: String, CodingKey {
case icon = "icon"
case name = "name"
case rating = "rating"
case userRatingsTotal = "user_ratings_total"
case vicinity = "vicinity"
}
}
let results : [Result]?
}
网络层 :
import UIKit
protocol DataModelDelegate:class {
func didRecieveDataUpdata(data:[String])
func didFailUpdateWithError(error:Error)
}
class DataModel: NSObject {
weak var delegate : DataModelDelegate?
var theatreNameArray = [String]()
var theatreVicinityArray = [String]()
var theatreiconArray = [String]()
func requestData() {
Service.sharedInstance.getClassList { (response, error) in
if error != nil {
self.delegate?.didFailUpdateWithError(error: error!)
} else if let response = response{
self.setDataWithResponse(response: response as [DataModelItem])
}
}
}
private func setDataWithResponse(response:[DataModelItem]){
for i in response[0].results!{
self.theatreNameArray.append(i.name!)
self.theatreVicinityArray.append(i.vicinity!)
self.theatreiconArray.append(i.icon!)
}
delegate?.didRecieveDataUpdata(data: theatreNameArray)
print("TheatreName------------------------->\(self.theatreNameArray)")
print("TheatreVicinity------------------------->\(self.theatreVicinityArray)")
print("Theatreicon------------------------->\(self.theatreiconArray)")
}
}
控制器:
class ViewController: UIViewController {
private let dataSource = DataModel()
override func viewDidLoad() {
super.viewDidLoad()
dataSource.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
dataSource.requestData()
}
}
extension ViewController : DataModelDelegate{
func didRecieveDataUpdata(data: [DataModelItem]) {
print(data)
}
func didFailUpdateWithError(error: Error) {
print("error: \(error.localizedDescription)")
}
}
APIManager:
class Service : NSObject{
static let sharedInstance = Service()
func getClassList(completion: (([DataModelItem]?, NSError?) -> Void)?) {
guard let gitUrl = URL(string: "") else { return }
URLSession.shared.dataTask(with: gitUrl) { (data, response
, error) in
guard let data = data else { return }
do {
let decoder = JSONDecoder()
let gitData = try decoder.decode(DataModelItem.self, from: data)
completion!([gitData],nil)
} catch let err {
print("Err", err)
completion!(nil,err as NSError)
}
}.resume()
}
}
我是 MVC 设计模式的新手。我创建了 "DataModel" 它将调用 API,创建数据,并使用委派将 return 数据发送到 ViewController,"DataModelItem" 将保存所有数据。 如何在 "requestData" 函数 中调用 DataModel 初始化函数。这是我的代码:
protocol DataModelDelegate:class {
func didRecieveDataUpdata(data:[DataModelItem])
func didFailUpdateWithError(error:Error)
}
class DataModel: NSObject {
weak var delegate : DataModelDelegate?
func requestData() {
}
private func setDataWithResponse(response:[AnyObject]){
var data = [DataModelItem]()
for item in response{
if let tableViewModel = DataModelItem(data: item as? [String : String]){
data.append(tableViewModel)
}
}
delegate?.didRecieveDataUpdata(data: data)
}
}
对于 DataModelItem:
class DataModelItem{
var name:String?
var id:String?
init?(data:[String:String]?) {
if let data = data, let serviceName = data["name"] , let serviceId = data["id"] {
self.name = serviceName
self.id = serviceId
}
else{
return nil
}
}
}
控制器:
class ViewController: UIViewController {
private let dataSource = DataModel()
override func viewDidLoad() {
super.viewDidLoad()
dataSource.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
dataSource.requestData()
}
}
extension ViewController : DataModelDelegate{
func didRecieveDataUpdata(data: [DataModelItem]) {
print(data)
}
func didFailUpdateWithError(error: Error) {
print("error: \(error.localizedDescription)")
}
}
我建议为 DataModel 使用单例实例,因为这将是一个 class 您将从应用程序中的许多点调用。 您可以在以下位置参考其文档: Managing Shared resources using singleton 有了这个,您将不需要在每次需要访问数据时都初始化此 class 实例。
How to implement simple MVC design pattern in Swift?
作为通用答案,在 iOS 开发中,您已经在隐式执行此操作!处理故事板意味着 view 层并控制它们如何工作的逻辑以及它们如何连接到 model 是通过创建来完成的查看控制器,这是默认流程。
对于您的情况,让我们澄清一点:根据标准 MVC,默认情况下调用 api 的负责层在逻辑上应该是视图控制器。然而,出于模块化、可重用性和避免创建大量视图控制器的目的,我们可以遵循您模仿的方法,这并不意味着它的模型责任,我们可以将其视为辅助辅助层(例如 MVC-N ),这意味着(根据您的代码)DataModel
是 而不是 模型,它是 "networking" 层,而 DataModelItem
是实际模型。
How to call a DataModel init function in "requestData" function
在我看来,它并没有引起轰动。您需要的是来自 DataModel
的实例,因此您可以调用所需的方法。
在视图控制器中:
let object = DataModel()
object.delegate = self // if you want to handle it in the view controller itself
object.requestData()
我只是在这里分享我的答案,我使用的是可编码的。它对任何人都有用:
型号:
import Foundation
struct DataModelItem: Codable{
struct Result : Codable {
let icon : String?
let name : String?
let rating : Float?
let userRatingsTotal : Int?
let vicinity : String?
enum CodingKeys: String, CodingKey {
case icon = "icon"
case name = "name"
case rating = "rating"
case userRatingsTotal = "user_ratings_total"
case vicinity = "vicinity"
}
}
let results : [Result]?
}
网络层 :
import UIKit
protocol DataModelDelegate:class {
func didRecieveDataUpdata(data:[String])
func didFailUpdateWithError(error:Error)
}
class DataModel: NSObject {
weak var delegate : DataModelDelegate?
var theatreNameArray = [String]()
var theatreVicinityArray = [String]()
var theatreiconArray = [String]()
func requestData() {
Service.sharedInstance.getClassList { (response, error) in
if error != nil {
self.delegate?.didFailUpdateWithError(error: error!)
} else if let response = response{
self.setDataWithResponse(response: response as [DataModelItem])
}
}
}
private func setDataWithResponse(response:[DataModelItem]){
for i in response[0].results!{
self.theatreNameArray.append(i.name!)
self.theatreVicinityArray.append(i.vicinity!)
self.theatreiconArray.append(i.icon!)
}
delegate?.didRecieveDataUpdata(data: theatreNameArray)
print("TheatreName------------------------->\(self.theatreNameArray)")
print("TheatreVicinity------------------------->\(self.theatreVicinityArray)")
print("Theatreicon------------------------->\(self.theatreiconArray)")
}
}
控制器:
class ViewController: UIViewController {
private let dataSource = DataModel()
override func viewDidLoad() {
super.viewDidLoad()
dataSource.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
dataSource.requestData()
}
}
extension ViewController : DataModelDelegate{
func didRecieveDataUpdata(data: [DataModelItem]) {
print(data)
}
func didFailUpdateWithError(error: Error) {
print("error: \(error.localizedDescription)")
}
}
APIManager:
class Service : NSObject{
static let sharedInstance = Service()
func getClassList(completion: (([DataModelItem]?, NSError?) -> Void)?) {
guard let gitUrl = URL(string: "") else { return }
URLSession.shared.dataTask(with: gitUrl) { (data, response
, error) in
guard let data = data else { return }
do {
let decoder = JSONDecoder()
let gitData = try decoder.decode(DataModelItem.self, from: data)
completion!([gitData],nil)
} catch let err {
print("Err", err)
completion!(nil,err as NSError)
}
}.resume()
}
}