Так что в настоящее время у меня возникли некоторые проблемы в отношении написания запроса GET в моей модели данных и вызова его в моем ViewController
. У меня нет проблем с написанием запроса GET и вызовом его из ViewController
, если нет функции Init()
.Где лучше всего разместить запрос GET и вызвать функцию init в ViewController
Вы просто инициализировать ViewController
как так и называют его в viewDidLoad
Class ViewController {
var dataModel = DataModel()
override func viewDidLoad() {
super.viewDidLoad()
dataModel.downloadInfo {
print(dataModel.info)
// Calls a completion handler, and won't print any info until the data is downloaded.
// retrieve the info from the data model.
}
}
Но если в моем DataModel я сделать что-то вроде
Class DataModel {
var info1: String!
var info2: String!
var info3: String!
init(info1: String, info2: String, info3: String) {
}
func downloadInfo(completed: @escaping downloadComplete) {
Alamofire.request(URL).responseJSON { response in
// GET request, parse data, and assign to variables
completed()
}
}
}
Я больше не может инициализировать мой ViewController
без прохождения в них свойства. Но я не могу назвать эти свойства, пока не загружу данные.
Так что я могу больше сделать
Class ViewController {
var dataModel = DataModel()
}
, но если я
Class ViewController {
var dataModel: DataModel!
override func viewDidLoad() {
super.viewDidLoad()
dataModel.downloadInfo {
DataModel(dataModel.info1, dataModel.info2, dataModel.info3)(
// initialize after properties get downloaded.
}
я получаю неожиданно вернулся ноль, потому что я не инициализировать в начале.
Итак, я попытался инициализировать пустые данные, потому что я не могу получить свои реальные данные до тех пор, пока они не будут загружены.
Class ViewController {
var infoArray = [datModel]()
var dataModel = DataModel(info1: "", info2: "", info3: "")
override func viewDidLoad() {
super.viewDidLoad()
dataModel.downloadInfo {
let infoVar = DataModel(dataModel.info1, dataModel.info2, dataModel.info3)
self.infoArray.append(infoVar)
// append the datModel information into an array.
}
}
Технически это работает, но я делаю это неправильно, потому что это, кажется, как обходной путь, а не решение очень распространенной задачей. Наконец, единственная другая проблема, которую я получаю, заключается в том, что я получаю только один объект в массиве, а не сотни, которые должны быть.
Наличие 'downloadInfo' как метода экземпляра в вашей модели данных на самом деле не имеет смысла. Это должен быть метод в отдельном классе, который отвечает за загрузку и создание объектов модели, или, по крайней мере, это должен быть метод класса, если вы хотите сохранить его в своей модели данных. – dan
@dan Я только что обновил метод Get Request, чтобы точно отразить то, что у меня есть. –