2016-04-03 7 views
7

Ich arbeite an einem Pull-to-Refresh auf iOS mit Swift.
Ich habe ein Array mit Städtenamen, cityNames = ["Chicago", "New York City"]
Ich implementiert eine Pull-to-Refresh, um Temperaturdaten aus dem Internet zu holen. Jedes Mal, wenn ich die Pull-to-Refresh-Funktion triggere, wird es ins Internet gehen und die Temperatur für jede Stadt im cityNames Array abrufen.
Hier ist der Code für Pull-to-Refresh
Pull-to-refresh ändert Array-Wert?

var weatherDetail = [Weather]() 
// Pull to refresh 
func refreshData() { 
    var cityNames = [String]() 
    for (index, _) in weatherDetail.enumerate() { 
     let info = weatherDetail[index] 
     cityNames.append(info.cityName) 
    } 
    print(cityNames) 
    weatherDetail.removeAll() 
    for city in cityNames { 
     self.forwardGeocoding(city) 
    } 
    weatherCityTable.reloadData() 
    refreshControl.endRefreshing() 
} 

In dem obigen Code, weatherDetail eine Reihe von Modell ist (ich bin nicht sicher, wie dieser Begriff, aber Weather ist ein Modell, das enthält Stadtnamen, Temperatur, Sonnenaufgangszeit, hohe/niedrige Temperatur
forwardGeocoding ist eine Funktion, die die Geokoordination für eine Stadt erhält, die dann eine Anfrage sendet, um die Wetterdaten für diese Stadt zu erhalten
Die Pull-to-Refresh-Funktion Das Problem, auf das ich stoße, ist für die ersten 2,3 Male, wenn ich ziehe, es funktioniert ohne Problem. Aber wie ich öfter ziehe, wird das Array plötzlich zuwechseln
Vielen Dank für Ihre Hilfe, bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. UPDATE:
Ich entfernte weatherDetail.removeAll(), versuchen Sie, nur die gleichen Daten an das Array anzuhängen. Nach der Aktualisierung wird "Chicago", "New York City", "Chicago", "Chicago" ausgedruckt. Wenn ich es mehrmals aktualisiere, wird etwas wie "Chicago", "New York City", "Chicago", "Chicago", "Chicago", "Chicago"

+0

Das Array cityNames befindet sich nicht in Ihrem Code. Wie ist es gefüllt? – Darko

+0

@Darko Vielen Dank für den Hinweis, nur den Code geändert. –

+0

Ein Problem, das aus dem angegebenen Code ersichtlich ist: Sie fügen nur cityNames hinzu, löschen es aber nie. – Darko

Antwort

5

Ist forwardGeocodierung synchron? Wann wird weatherDetail eingestellt/aktualisiert?

Es sieht für mich so aus, als hätten Sie hier ein Synchronicity-Problem, das wahrscheinlich durch die Latenz noch verschlimmert wird.

3

ausgedruckt. Wenn Stadtnamen zweimal wiederholt werden, bedeutet dies, dass Informationen im Array weatherDetail ebenfalls zweimal wiederholt werden. Versuchen Sie, vor dem Drucken weatherDetail zu drucken cityNames. Wenn weatherDetail zweimal wiederholt wird, sollten Sie den Code suchen, der die gleichen Weather Objekte zweimal hinzufügt, und beseitigen Sie es.

Zu Testzwecken, suchen Sie jeden Ort, der weatherDetail ändert, und vor diesen Aussagen setzen Sie weatherDetail.removeAll(). Wenn das Ihr Problem beseitigt, suchen Sie nach dem Code, der weatherDetail redundante Informationen hinzufügt.

+0

Das Problem ist nicht die Stadt Namen werden zweimal wiederholt, es wurde auf den gleichen Wert ersetzt. –

+0

Haben Sie versucht, "weatherDetail" vor "cityNames" zu drucken? Enthält es in allen Elementen die gleichen 'Weather'-Informationen? Hast du deinen Fehler in einem Array mit 5-10 Objekten getestet? "cityNames" ist nur ein Ergebnis der Zuordnung von 'weatherDetail', also bin ich mir ziemlich sicher, dass du Werte in deiner' weatherDetail' wiederholst, und das ist die Wurzel allen Übels. – xinatanil

+0

Da 'weatherDetail' mit einem Modell erstellt wird, ist beim Ausdrucken nur '[, ]'. Wenn ich es mit 5-10 Objekten teste, wird das Array zu Chicago, Chicago, Chicago, New York, New York, Washington, Washington, Washington, "Peking"] 'Während ich ursprünglich in 9 verschiedenen Städten eingesetzt habe. –

4

Mit enumerate() und append() tun dies kein guter Ansatz ist, gibt es eine mehr Eleganz und fehlersichere Art und Weise, dies zu erreichen:

let cityNames:[String] = weatherDetail.map { weather -> String in 
    weather.cityName 
} 

Oder schreiben Sie einfach:

let cityNames:[String] = weatherDetail.map { $0.cityName } 
+0

Ich habe das versucht, aber das Problem besteht immer noch. –