2015-08-20 50 views
1

我正在使用Alamofire和SwiftyJSON將JSON數據傳遞給數組。SWIFT2:對數組的JSON請求返回不同的值

第一打印返回正確的數組:

[(1, "Arena", "Oklahoma"), (2, "Stafium", "Berlin")] 

但第二打印一個空數組:

[] 

我不明白爲什麼?

這是我的代碼。 解決的@NickCatib

typealias cType = (ID: Int,Tag: String, Location: String) 

var cBlue = [cType]() 

var NumRows = 0 

class MainViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    Alamofire.request(.GET, url, parameters: ["postType": "live"]).responseJSON { (_, _, result) in 

     switch result { 

      case .Success(let data): 

       let json = JSON(data) 

       for(_,subJSON) in json["LocalInfo"] { 

        let ID = subJSON["id"].int! 
        let Tag = subJSON["Tag"].string! 
        let Location = subJSON["Location"].string! 

        let Info = (ID: ID, Tag: Tag, Location: Location) 

        cBlue.append(Info) 

       } 
       self.tableView.reloadData() 

      case .Failure(_, let error): 

       print("Request failed with error: \(error)") 
     } 

    } 

    } 

func numberOfSectionsInTableView(tableView: UITableView) -> Int {  
    return 1 
} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    reloadUI() 
    return cBlues.count 
} 

func tableView(tableView: UITableView, 
    cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 


{ 
     let cell = tableView.dequeueReusableCellWithIdentifier("CellConcert", 
      forIndexPath: indexPath) 
     let info = cBlue[indexPath.row] as! Info 
     cell.textLabel?.text = info.Tag 

     return cell 
    } 
} 

這是正確的嗎?

感謝

回答

2

NOTE:事實上這是很簡單的:BEFORE Alamofire請求完成你的第二個打印將執行 - Alamofire.request是異步調用,將執行以後。

如果您正在使用UITableView,您將在收到請求後收到您的信息,如果您需要設置某些UI元素,則必須調用某種重新加載視圖或relaodData()

你可以叫reloadUI(),您的自定義功能,在這裏:

//PRINTS THE ARRAY 
reloadUI() 
print(cBlue) 

例子:

類MainViewController:UIViewController的{

override func viewDidLoad() { 
    super.viewDidLoad() 

    Alamofire.request(.GET, url, parameters: ["postType": "live"]).responseJSON { (_, _, result) in 

     switch result { 

      case .Success(let data): 

       let json = JSON(data) 

       for(_,subJSON) in json["LocalInfo"] { 

        let ID = subJSON["id"].int! 
        let Tag = subJSON["Tag"].string! 
        let Location = subJSON["Location"].string! 

        let Info = (ID: ID, Tag: Tag, Location: Location) 

        cBlue.append(Info) 

       } 


      case .Failure(_, let error): 

       print("Request failed with error: \(error)") 
     } 
     //PRINTS THE ARRAY 
     reloadUI() 
     print(cBlue) 

    } 
    //PRINT [] EMPTY ARRAY 
    print(cBlue)  
    } 
} 

func reloadUI(){ 
    self.tagLabel.text = (cBlue[0] as! Info).tag 
    self.locationLabel.text = (cBlue[0] as! Info).location 
} 
+0

謝謝!所以如果我想使用Alamofire並將結果打印到Table中,我必須使用reloadUI()? – user3163404

+0

是啊,基本上,你將不得不通知視圖或控制器或其他任何你實際收到的數據,並且cBlue數組充滿了信息。對於tableView,可以使用reloadData()方法重新填充表格。另一方面,如果你使用UIView,UILabels等,你將不得不創建你自己的函數 - 在答案是reloadUI()將填充你的信息。 – Miknash

+0

Humm我不明白..你能提供一個例子嗎? – user3163404