So derzeit habe ich einige Probleme in Bezug auf das Schreiben einer GET-Anfrage in meinem Datenmodell und Aufruf in meinem ViewController
. Ich habe keine Probleme beim Schreiben einer GET-Anfrage und beim Aufruf von ViewController
, wenn es keine Init()
Funktion gibt.Wo ist der beste Ort, um eine GET-Anfrage und Aufruf einer Init-Funktion in der ViewController
Sie einfach initialisieren ViewController
wie so und nennt es in 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.
}
}
Aber wenn in meinem Datamodel ich etwas tun, wie
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()
}
}
}
kann ich nicht mehr meine ViewController
initialisieren, ohne in diesen vorbei Eigenschaften. Aber ich kann diese Eigenschaften nicht aufrufen, bis ich die Daten heruntergeladen habe.
So kann ich mehr
Class ViewController {
var dataModel = DataModel()
}
aber wenn ich
Class ViewController {
var dataModel: DataModel!
override func viewDidLoad() {
super.viewDidLoad()
dataModel.downloadInfo {
DataModel(dataModel.info1, dataModel.info2, dataModel.info3)(
// initialize after properties get downloaded.
}
bekomme ich unerwartet zurück Null, weil ich nicht am Anfang initialisiert wurde.
Also habe ich versucht, mit leeren Daten zu initialisieren, weil ich meine realen Daten nicht abrufen kann, bis es heruntergeladen wird.
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.
}
}
Technisch funktioniert das, aber bin ich es falsch zu machen, weil dies wie eine Abhilfe scheint, keine Lösung für häufig auftretende Aufgabe. Schließlich ist das einzige andere Problem, das ich erhalte, dass ich nur ein Objekt im Array bekomme, nicht die Hunderte, die es geben sollte.
Die Verwendung von 'downloadInfo' als Instanzmethode für Ihr Datenmodell ist nicht wirklich sinnvoll. Es sollte eine Methode in einer separaten Klasse sein, die für das Herunterladen und Erstellen Ihrer Modellobjekte verantwortlich ist, oder es sollte zumindest eine Klassenmethode sein, wenn Sie sie in Ihrem Datenmodell behalten möchten. – dan
@dan Ich habe gerade meine Get-Request-Methode aktualisiert, um genau zu reflektieren, was ich habe. –