无法在SWIFT中保留方法之外的数组数据

时间:2015-07-17 09:30:10

标签: ios arrays swift swift-playground

我使用alamofire将数组中的类别名称存储在数组中。

仅当从此方法CategoryNameFunc调用数组时,该数组才具有值。

如果我从tableview或任何其他方法调用数组,它总是returns 0

CODE

    var CategoryNameArray : [String] = []

        override func viewDidLoad() {
            super.viewDidLoad()
            Network()
            tester()
        }

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return CategoryNameArray.count     // This returns 0
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell : UITableViewCell = self.TableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell

    println(self.CategoryNameArray[indexPath.row])

    cell.textLabel?.text = "Hello"

    return cell
}


        func Network(){
            Alamofire.request(.GET, "http://www.wive.com/index.php/capp/category_list")
                .responseJSON { (_, _, data, _) in
                    let json = JSON(data!)
                    let count = json.count
                    self.CategoryNameFunc(json, Count: count) }
        }

        func CategoryNameFunc(Json: JSON, Count: Int)
        {
            for index in 0...Count-1 {
                let name = Json[index]["CATEGORY_NAME"].string
                CategoryNameArray.append(name!)
            }
            // This returns 23 (The correct value)
               println(self.CategoryNameArray.count)
        }

2 个答案:

答案 0 :(得分:1)

当您调用Network()函数时,它会创建一个新线程(Alamofire启动异步请求),而tester()函数在您计算{Network()函数之前不会等待CategoryNameArray()函数完成{1}}。但是你的CategoryNameFunc()函数等待网络操作完成。

答案 1 :(得分:0)

我不确定(没有使用Almofire)但它认为,这是因为方法Network,更准确地说是Almofire请求是异步触发的。

因此,方法Network()tester()同时运行,但由于Network()需要先获取数据,因此tester()更快并首先执行。

一个接一个地执行tester()Network()的正确方法是:

   func CategoryNameFunc(Json: JSON, Count: Int)
    {
        for index in 0...Count-1 {
            let name = Json[index]["CATEGORY_NAME"].string
            CategoryNameArray.append(name!)
        }
        // run tester, AFTER you have the data.
        tester()
    }