2017-04-13 4 views
1
//uitableoutletname 
@IBOutlet weak var tableview: UITableView! 
//overridefunction 
override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    let url = URL(string: "http://api.fixer.io/latest") 
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     if error != nil 
     { 
      print ("ERROR") 
     } 
     else 
     { 
      if let content = data 
      { 
       do 
       { 
        //Array 
        let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 


        //convert to nsdictionary 
        if let rates = myJson["rates"] as? NSDictionary 
        { 
         var myarry = [NSString]() 
         for (_,value) in rates 
         { 

          //thispart is giving error how cat it be resolved 


          myarry.append(value as! NSString) 
          self.tableview.beginUpdates() 
          self.tableview.insertRows(at: [IndexPath(row: myarry.count-1, section: 0)], with: .automatic) 
          self.tableview.endUpdates() 
         } 
        } 
       } 
       catch 
       { 

       } 
      } 
     } 
    } 
    task.resume() 
} 

ich fetch Daten durch json Aufruf konvertiert es in nsdictionary und versuchen, in uitableview einzufügen. Es gibt einige Laufzeitfehler. Während ich variablen Wert drucke, und Taste, die print comant benutzt, funktioniert es tadellos.wie nsdictionary Wert für alle Schlüssel zu uitableview swift 3.0

+0

Was ist Ihr Laufzeitfehler? – Sneha

Antwort

0

Die dataTask ist eine asynchrone Aufgabe, sollten Sie die Benutzeroberfläche auf dem Haupt-Thread aktualisieren. Lassen Sie auch den Swift-Typ verwenden, der NSDictionary und NSString verwendet.

if let rates = myJson["rates"] as? [String: Double] { 

    DispatchQueue.main.async { 

     for (_, value) in rates { 

      self.myarry.append(String(value)) 
      self.tableview.beginUpdates() 
      self.tableview.insertRows(at: [IndexPath(row: self.myarry.count-1, section: 0)], with: .automatic) 
      self.tableview.endUpdates() 
     } 
    } 
} 
0

Für mich sieht es so aus, als würden Sie UI-Code von nicht-mein-Thread abfeuern, da URLSession einen eigenen Thread erstellt. Versuchen Sie, Ihre Tabellenansicht Code mit GCD wickeln:

DispatchQueue.main.async { 
    self.tableview.beginUpdates() 
    self.tableview.insertRows(at: [IndexPath(row: myarry.count-1, section: 0)], with: .automatic) 
    self.tableview.endUpdates() 
} 
Verwandte Themen