2016-07-05 5 views
0

Ich bin ziemlich neu in iOS-Programmierung und ich habe Probleme bei der Verwendung von Variablen aus einer Abschlussanweisung. Ich habe den folgenden Code eingefügt, ich bin mir nicht sicher warum, wenn ich die Abschlussvariablen in einem Array DataType speichern, scheint nur leere Zeichenfolgen zurückgeben.Beim Abrufen von Daten aus der Vervollständigung Statement-Variablen leer

Hinweis: Die Fertigstellung Daten werden in der loadSampleStockData Funktion aufgerufen, und es wird später nehme an Zellen in func Tableview werden zurückgegeben (Tableview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

Vielen Dank für jede Hilfe, die kann vorgesehen werden!

import UIKit 

class dashboardViewController: DefaultViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var balanceLabel: UILabel! 

    var stocks = [stockData]() 
    let stock = stockinfo() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.delegate = self 
     tableView.dataSource = self 
     tableView.reloadData() 
     loadSampleStockData() 
     user.newUser() // Move to login function when login and registration is implemented 

     //Sets the Balance Label on Dashboard 
     balanceLabel.text = "$" + String(format: "%.2f", user.getBalance()) 
    } 

    func loadSampleStockData() { 

     var stock1: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "") 
     var stock2: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "") 
     var stock3: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "") 

     stock.getInfo("FB") {(name, price, change) in dispatch_async(dispatch_get_main_queue(),{ 
      stock1 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "FB") 
      stocks.append(stock1) 
     }) 
     } 

     stock.getInfo("MSFT") {(name, price, change) in dispatch_async(dispatch_get_main_queue(),{ 
      stock2 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "MSFT") 
      stocks.append(stock2) 
     }) 
     } 

     stock.getInfo("APPL") {(name, price, change) in dispatch_async(dispatch_get_main_queue(),{ 
      stock3 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "APPL") 
      stocks.append(stock3) 
     }) 
     } 
     print(stocks.count) 
    } 

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

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

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

     let cellIdentifier = "stockViewCell" 

     let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! stockTableViewCell 

     let stock = stocks[indexPath.row] 

     cell.stockName.text = stock.name 
     cell.stockPercentage.text = stock.percentageChange 
     cell.stockDollarChange.text = stock.askPrice 
     cell.stockTicker.text = stock.stockTicker 

     return cell 
    } 
} 

Antwort

1

Da stocks += [stock1, stock2, stock3] auftritt, bevor Ihr async Anrufe stock1...3 auf alles eingestellt haben.

Die Erstellung von stocks sollte in einem Beendigungshandler erfolgen.

+0

Danke für die Antwort, könnte eine ignorante Frage sein, aber wenn ich Aktien innerhalb der Completion-Handler initiieren würde ich nicht in der Lage sein, sie in einem anderen Abschluss-Handler und damit die anderen Funktionen wegen der variablen Bereich aufrufen? Da ich vielleicht ein Missverständnis habe, würde es Ihnen etwas ausmachen, ein Code-Snippet zur Verfügung zu stellen? Vielen Dank für Ihre Hilfe. –

+0

Sie benötigen einen gemeinsamen Status, z. B. die Instanzvariable, die Sie hier haben. Jeder Abschluss-Handler wird asynchron zum Array hinzugefügt, und der Haupt-Thread wird warten, bis alles fertig ist. – Alexander

+0

Vielen Dank für Ihre Geduld und die Zeit, um mir dabei zu helfen. Ich habe versucht, zu den Daten zu "Beständen" im Beendigungshandler hinzuzufügen. Wie würde ich "Bestände" in die Completion Handler geben? Ich habe meine Änderungen oben vorgenommen, gehe ich falsch vor und wenn ja, würde es Ihnen etwas ausmachen, mir ein Code-Snippet zur Verfügung zu stellen. Vielen Dank für Ihre Hilfe Ich werde weiterhin google und lesen Sie die Dokumentation –

Verwandte Themen