2016-07-25 13 views
0

Mein aktuelles Problem ist, dass, wenn die Funktion updateLabels aufgerufen wird, mein TableView einfriert. Mein Ziel ist es, die Namen und Titel von Radiosendern alle 15 Sekunden zu aktualisieren. Ich habe ein dict-Array, das die Informationen und die Funktion enthält, die das dict-Array alle 15s auffüllt. Jede Station hat eine separate JSON Link-Datei, die ich in meine getData Funktionsparameter eingegeben habe. Was kann ich tun, um es besser zu machen und zu verhindern, dass TableView einfriert?Parsen von JSON friert tableView ein SWIFT

Hauptarray

var songNames = [ 
       (songArtist: "", songName: ""), 
       (songArtist: "", songName: ""), 
       ..... 
      ] 

Update Lieder Titel und Namen

func updateLabels() { 
    songNames.removeAll() 
    songNames.append((songArtist: getData("rd").artistName, songName: " - \(getData("record").songName)")) 
    songNames.append((songArtist: getData("mix").artistName, songName: " - \(getData("mix").songName)")) 
    tableView.reloadData() 
} 

erhalten Daten von JSON Link

func getData(urlPart: String) ->(artistName: String, songName: String) { 
    let mainURl = "http://...json" 
    let url = NSURL(string: mainURl) 
    let jsonData = NSData(contentsOfURL: url!) as NSData! 
    let readableJSON = JSON(data: jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) 
    let songArtistName = readableJSON["ARTIST"] 
    let songName = readableJSON["NAME"]     
    return (songArtistName.description, songName.description) 
} 

in meinem viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 
    updateLabels() 
    //**Timer to call the function every 15 sec** 
    NSTimer.scheduledTimerWithTimeInterval(15, target: self, selector: #selector(self.updateLabels), userInfo: nil, repeats: true) 
} 
+1

Natürlich friert es ein, wenn Sie Daten auf Haupt-Thread herunterladen. Nachschlagen, wie man es asynchron macht. – Michal

+0

Muss ich Alamofire verwenden? –

+0

Es ist praktisch, weil es die Standardmethode ist, aber in Ihrem Fall scheint es nicht so. Sehen Sie sich einfach an, wie die Funktionen von dispatch_async funktionieren und wickeln Sie sie um Ihren Download-Code herum. Vergessen Sie nicht, in die Hauptwarteschlange zu springen, wenn Sie die Benutzeroberfläche aktualisieren müssen! – Michal

Antwort

0

Versuchen Einfädeln mit/Grand Central Dispatch Wenn Sie wissen es nicht. Genau das tut, wie ..

dispatch_async(dispatch_get_main_queue(), {() -> Void in 

//call your function here.. 

}) 

Ist dies nicht die Lösung nur unter kommentieren .. Ich werde helfen ..

+0

Ich werfe meinen NSTimer in dispatch_async und die App bleibt eingefroren –

+0

Keine Notwendigkeit für Verwenden von NSTimer. Verwenden Sie anstelle von NSTimer diesen 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in // zeitaufwendige Aufgabe' dispatch_async (dispatch_get_main_queue(), {() -> Void in }) – JAck

+0

wird es nur einmal laufen? –

1

Nun, das Hauptproblem ist, weil Sie JSON Daten auf dem Haupt-Thread bekommen, deshalb Benutzeroberfläche friert ein. Anstatt es auf dem Hauptthread zu tun, sollten Sie diese Aufgabe async auf Hintergrundthread versenden.

Am Ende der async Hintergrundaufgabe, iOS SDK wird den Programmfluss zum Hauptthread wechseln, wo Sie Ihre UI-Komponenten mit abgerufenen JSON Daten aktualisieren müssen.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Get JSON data here 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Update UI here 
    }); 
});