2016-04-03 12 views
7

Sto lavorando a un pull-to-refresh su iOS con Swift.
Ho un array con i nomi di città, cityNames = ["Chicago", "New York City"]
Ho implementato un pull-to-refresh per recuperare i dati di temperatura da Internet. Quindi ogni volta che faccio scattare il pull-to-refresh, andrà su Internet e otterrà la temperatura per ogni città nell'array cityNames.
Qui è il codice per pull-a-refresh
Pull-to-refresh modifica il valore dell'array?

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() 
} 

Nel codice precedente, weatherDetail è una gamma di modelli (io non sono sicuro di come frase, ma Weather è un modello, che contiene nomi di città, temperatura, tempo di innalzamento del sole, temperatura alta/bassa
forwardGeocoding è una funzione che ottiene il coordinamento geografico di una città, quindi invia una richiesta per ottenere i dati meteorologici per quella città
I lavori di pull-to-refresh , il problema che sto incontrando è, per le prime 2,3 volte in cui tiro, funziona senza problemi, ma mentre tiro più volte, la matrice cambierà improvvisamente in cityNames = ["Chicago", "Chicago"]
Grazie per il vostro aiuto, per favore fatemi sapere se avete bisogno di ulteriori informazioni.
UPDATE:
Ho rimosso weatherDetail.removeAll(), provare ad aggiungere gli stessi dati all'array. Dopo l'aggiornamento, stampa "Chicago", "New York City", "Chicago", "Chicago". Se lo aggiorno più volte, stampa qualcosa come "Chicago", "New York City", "Chicago", "Chicago", "Chicago", "Chicago"

+0

L'array cityNames non è nel codice. Come è riempito? – Darko

+0

@Darko Grazie per il punto, ho appena modificato il codice. –

+0

Un problema che è visibile dal codice dato: stai semplicemente accedendo a cityNames ma non lo elimini mai. – Darko

risposta

5

Is forwardGeocoding sincrono? Quando si imposta/aggiorna WeatherDetail?

Mi sembra che tu abbia una sorta di problema di sincronicità in corso qui, probabilmente esacerbato dalla latenza.

3

Se i nomi delle città vengono ripetuti due volte, ciò significa che le informazioni nell'array weatherDetail vengono ripetute anche due volte. Prova a stampare weatherDetail prima di stampare cityNames. Se weatherDetail viene ripetuto due volte, è necessario individuare il codice che aggiunge gli stessi oggetti Weather due volte ed eliminarlo.

Per scopi di test, individuare ogni posizione che modifica weatherDetail e prima di tali istruzioni inserire weatherDetail.removeAll(). Se ciò rimuove il tuo problema, cerca il codice che aggiunge informazioni ridondanti a weatherDetail.

+0

Il problema non è che i nomi delle città vengono ripetuti due volte, ma sono stati sostituiti con lo stesso valore. –

+0

Hai provato a stampare 'weatherDetail' prima di' cityNames'? Contiene le stesse informazioni di Weather in tutti gli elementi? Hai testato il tuo bug su un array con 5-10 oggetti? 'cityNames' è solo un risultato della mappatura di' weatherDetail', quindi sono abbastanza sicuro che tu abbia valori ripetuti nel tuo 'weatherDetail', e questa è la radice di tutto il male. – xinatanil

+0

Poiché 'weatherDetail' è stato creato con un modello, quando lo stampo, tutto ciò che ho ottenuto è' [, ] '. Quando lo collaudo con 5-10 oggetti, l'array diventerà '[" Chicago "," Chicago "," Chicago "," New York "," New York "," Washington "," Washington "," Washington ", "Pechino"] 'Mentre inizialmente ho inserito 9 città diverse. –

4

Utilizzando enumerate() e append() per fare questo non è un buon approccio, v'è una maggiore eleganza e a prova di errore modo per raggiungere questo:

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

O semplicemente scrivere:

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

Ho provato questo, tuttavia il problema esiste ancora. –