2017-02-06 12 views
0

Так что в настоящее время у меня возникли некоторые проблемы в отношении написания запроса 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. 
} 
} 

Технически это работает, но я делаю это неправильно, потому что это, кажется, как обходной путь, а не решение очень распространенной задачей. Наконец, единственная другая проблема, которую я получаю, заключается в том, что я получаю только один объект в массиве, а не сотни, которые должны быть.

+0

Наличие 'downloadInfo' как метода экземпляра в вашей модели данных на самом деле не имеет смысла. Это должен быть метод в отдельном классе, который отвечает за загрузку и создание объектов модели, или, по крайней мере, это должен быть метод класса, если вы хотите сохранить его в своей модели данных. – dan

+0

@dan Я только что обновил метод Get Request, чтобы точно отразить то, что у меня есть. –

ответ

0

Самый простой подход, по которому я бы пошел; состоит в том, чтобы сделать свойства опциями. Это облегчит вам работу, которую вы определили.

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

А во-вторых, сделать сделать асинхронной загрузки вызова (с обратного вызова в качестве аргумента метода), чтобы позволить UI немедленно загрузить. Это сделает Пользователя намного лучше!

+0

Это уже сделано async, используя Alamofire, но спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^