2017-02-06 1 views
0

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.

+0

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

+0

@dan Ich habe gerade meine Get-Request-Methode aktualisiert, um genau zu reflektieren, was ich habe. –

Antwort

0

Der einfachste Weg, den ich gehen würde; ist es, die Eigenschaften optionals zu machen. Es wird Ihnen helfen, die von Ihnen identifizierte Arbeit zu erledigen.

Class DataModel { 
var info1: String? 
var info2: String? 
var info3: String? 
} 
0

Und zweitens tun der Download-Aufruf async (als Argument an die Methode mit einem Rückruf) machen die Benutzeroberfläche zu ermöglichen, sofort zu laden. Es wird die Userfahrung viel besser machen!

+0

Es ist bereits async mit Alamofire getan, aber danke. –

Verwandte Themen