現在、私はデータモデルでGETリクエストを作成し、それをViewController
と呼んでいます。 Init()
機能がない場合、私はGET要求を書いてViewController
から呼び出すことに問題はありません。GETリクエストを配置し、ViewControllerで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()
}
}
}
ような何かを行う場合プロパティ。しかし、データをダウンロードするまでこれらのプロパティを呼び出すことはできません。
だから私は長い
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.
}
をすれば、私が最初に初期化していなかったので、私は予想外にnilを返されます。
私は実際のデータがダウンロードされるまで取得できないため、空のデータで初期化しようとしました。
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.
}
}
これは技術的にはうまくいきますが、これは回避策のように思えますが、非常に一般的な課題に対する解決策ではないためです。 最後に、私が受け取る他の唯一の問題は、配列内にオブジェクトが1つしか存在しないことです。
データモデルで 'downloadInfo'をインスタンスメソッドとして使用することは、実際には意味がありません。これは、モデルオブジェクトのダウンロードと作成を担当する別のクラスのメソッドである必要があります。または、少なくともデータモデルに保持したい場合は、クラスメソッドでなければなりません。 – dan
@dan私は自分の持っているものを正確に反映するためにGet Requestメソッドを更新しました。 –