2017-02-06 3 views
0

現在、私はデータモデルで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つしか存在しないことです。

+0

データモデルで 'downloadInfo'をインスタンスメソッドとして使用することは、実際には意味がありません。これは、モデルオブジェクトのダウンロードと作成を担当する別のクラスのメソッドである必要があります。または、少なくともデータモデルに保持したい場合は、クラスメソッドでなければなりません。 – dan

+0

@dan私は自分の持っているものを正確に反映するためにGet Requestメソッドを更新しました。 –

答えて

0

最も簡単なアプローチは、プロパティをオプションにすることです。それはあなたが特定した回避策を実行する必要があるためにあなたを軽減します。

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

そして第二に、UIはすぐにロードされるようにするには(メソッドの引数としてコールバック付き)ダウンロードコール非同期を作るのですか。これは、ユーザーエクスペリエンスをより良くするでしょう!

+0

Alamofireを使用して既に非同期になっていますが、ありがとうございます。 –

関連する問題