我使用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)
}
答案 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()
}