从两个不同的网络请求填充自定义类的数组

时间:2015-05-31 22:35:14

标签: ios uitableview swift alamofire swifty-json

在我的Swift iOS项目中,我尝试使用Alamofire检索的JSON数据填充自定义类对象数组,并使用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()
    }
}

我遇到的第一个问题是for循环中的i达到了3并且当我认为它真的不应该导致错误时因为JSON数组只包含3个条目。我的另一个主要问题是,在我的UI中使用重新加载按钮手动触发reloadData()之前,表视图将为空,即使这样,表中的数据也存在问题。

非常感谢任何帮助,因为我对iOS和Swift非常陌生并且处理Alamofire的异步调用让我很困惑。我写的代码变得如此之大,产生了很多小错误,我想可能会有更好的方法来实现我的目标。对于冗长的问题感到抱歉,并提前感谢任何回复!

1 个答案:

答案 0 :(得分:0)

Alamofire请求立即返回并且并行执行闭包,这将需要一些时间才能完成。在Alamofire返回后立即调用您的完成处理程序,但数据尚未可用。您需要在Alamofire闭包内调用它 - 这可以确保在数据可用后调用它。