Заполнить массив пользовательских классов из двух разных сетевых запросов

В моем проекте Swift iOS я пытаюсь заполнить массив пользовательских объектов класса, используя данные JSON, полученные с помощью Alamofire и проанализированные с помощью SwiftyJSON. Однако моя проблема заключается в объединении результатов двух разных сетевых запросов, а затем заполнении UITableView результирующим массивом.

Мой пользовательский класс реализован:

class teamItem: Printable {
var name: String?
var number: String?

init(sqljson: JSON, nallenjson: JSON, numinjson: Int) {
    if let n = sqljson[numinjson, "team_num"].string! as String! {
        self.number = n
    }
    if let name = nallenjson["result",0,"team_name"].string! as String! {
        self.name = name
    }

}

var description: String {
    return "Number: \(number) Name: \(name)"
}
}

Вот мой viewDidLoad():

    override func viewDidLoad() {
    super.viewDidLoad()


    tableView.dataSource = self
    refresh() {
        () -> Void in
            self.tableView(self.tableView, numberOfRowsInSection: self.teamsArr.count)
            self.tableView.reloadData()
        for item in self.teamsArr {
            println(item)
        }
            return
        }
    self.tableView.reloadData()
    }

который переходит к методу refresh():

func refresh(completionHandler: (() -> Void)) {
    populateArray(completionHandler)
}

и, наконец, populateArray():

    func populateArray(completionHandler: (() -> Void)) {
    SqlHelper.getData("http://cnidarian1.net16.net/select_team.php", params: ["team_num":"ALL"]) {
        (result: NSData) in
        let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(result, options: NSJSONReadingOptions.MutableContainers, error: nil)
        let json = JSON(jsonObject)
        self.json1 = json
        println(json.count)
        for var i = 0; i < json.count; ++i {
            var teamnum = json[i,"team_num"].string!
            NSLog(teamnum)
            Alamofire.request(.GET, "http://api.vex.us.nallen.me/get_teams", parameters: ["team": teamnum])
                .responseJSON { (req, res, json, err) in
                    let json = JSON(json!)
                    self.json2 = json
                        self.teamsArr.append(teamItem(sqljson: self.json1, nallenjson: self.json2, numinjson: i))
            }
        }
        completionHandler()
    }
}

первая проблема, с которой я столкнулся, заключалась в том, что i в цикле for достигло 3 и вызвало ошибки, когда я думал, что этого действительно не должно быть, потому что этот массив JSON содержит только 3 записи. Другая моя основная проблема заключалась в том, что представление таблицы было пустым, пока я вручную не активировал reloadData() с помощью кнопки перезагрузки в своем пользовательском интерфейсе, и даже тогда были проблемы с данными в таблицах.

очень ценю любую помощь, так как я новичок в iOS и Swift, и работа с асинхронными вызовами Alamofire меня действительно смутила. Код, который я пишу, стал таким большим и породил так много мелких ошибок, что я подумал, что, возможно, есть лучший способ достичь моей цели. Извините за многословный вопрос, и заранее спасибо за любые ответы!


person I Wolterstorff    schedule 31.05.2015    source источник


Ответы (1)


Запрос Alamofire немедленно возвращается и параллельно выполняет закрытие, для завершения которого потребуется некоторое время. Ваш обработчик завершения вызывается сразу после возврата Alamofire, но данные еще не доступны. Вам нужно вызвать его из замыкания Alamofire — это гарантирует, что он будет вызван после того, как данные станут доступными.

person MirekE    schedule 31.05.2015