Risoluzione della risposta del server lenta ma riuscita su iOS

0

Sto provando a risolvere due situazioni qui correlate a fare richieste POST e gestire le risposte.

  1. Esecuzione di una richiesta e interruzione della richiesta a causa della mancata risposta del server, oltre a presupporre che in questo caso non sia stato scritto nulla in un database ospitato sul server.
  2. Esecuzione di una richiesta e la richiesta è scaduta, ma ora le cose sono scritte su un server e il server potrebbe / eventualmente invierà una risposta. Quindi sto cercando di capire cosa dovrei fare in ciascuna di queste due situazioni. Situazione n. 2 è la cosa più importante per me, e non ho davvero un'idea su come risolverlo.

Ho solo una soluzione per la prima situazione, ma sarei interessato a conoscere le opinioni / le migliori pratiche su come risolvere anche questo.

Sto usando Swift 2.0 se questo è importante, quindi è iOS, e sto usando wrapper personalizzato attorno a NSURLSession e classi correlate per fare richieste.

Come informazioni aggiuntive posso descrivere come funziona la mia app:

Creo un oggetto modello, chiamandolo Dati. Così mando una rappresentazione JSON dell'oggetto su un server, la scrivo nel database e ricevo una risposta da un server che è stata registrata.

Questa è un'attività assegnata alla mia classe DataManager (che è un singleton) e gestisce richieste e risposte. Quando riceve una risposta da un server, aggiorna un oggetto modello appropriato e tramite l'interfaccia utente di aggiornamento di delega / notifica.

Quando un utente tocca il pulsante di invio, mostro l'indicatore di attività e imposto il testo di un'etichetta appropriata all'invio ... Ed è qui che possono sorgere queste due situazioni ...

Nella situazione n. 1, dirò all'utente che la richiesta è scaduta, annulla la richiesta e mostra un pulsante Riprova. Problema risolto.

Situazione n. 2 è più complicato ... L'utente tocerà il pulsante di invio e attenderà. Ma immagina se questo accada:

  • i dati inviati a un server sono scritti con successo
  • ma la risposta del server è stata molto lenta e supera il limite di timeout su un'app client
  • Visualizzo il messaggio di richiesta non riuscita a un utente, ma la richiesta non ha avuto esito negativo Quindi, ciò che può accadere qui, è che l'utente sperimenterà incoerenza tra ciò che vede su un dispositivo e ciò che è realmente sul server (almeno per un breve periodo di tempo).

Quindi, quando si verifica l'aggiornamento successivo, l'utente vedrà l'oggetto inviato in precedenza, anche se ha ricevuto il messaggio che dice "operazione fallita"

Come gestisci questo?

    
posta Whirlwind 07.10.2016 - 21:24
fonte

2 risposte

1

È possibile eseguire il ping del server più volte prima di inviare una richiesta e verificare la latenza dei ping. Imposta il tuo timeout superiore al tempo massimo di ritorno (diciamo 2x per essere generoso). Quando il client invia una richiesta al server, invia anche le informazioni sulla latenza in modo che il server non termini il tentativo di raggiungere il client.

Potresti fare i ping in background, ad esempio 1 ogni 10 secondi, quindi utilizzare i ping passati. Dato che si tratta di un processo in background puoi impostare il timeout incredibilmente lungo 1 prima di provare il prossimo ping in quanto non dovrebbe influenzare l'utilizzo principale del client.

Se non riesci a ottenere una sola risposta ping per calcolare la latenza è abbastanza sicuro dire che il server non riceverebbe il tuo messaggio iniziale.

1 Mentre potrebbe essere lungo testare se è possibile ottenere qualcosa in cambio, è necessario ricordare che probabilmente al tuo cliente non piacerà rimanere bloccato in un minuto "invio ..." schermo perché hai ritenuto che fosse corretto.

    
risposta data 07.10.2016 - 22:22
fonte
1

Il server potrebbe inviare uno stato 202 (richiesta accettata). Il che significa che la richiesta è stata accettata dal server, ma non è ancora stata presa in considerazione. E l'azione può fallire ovviamente, ma di solito non fallirà. Sembra un approccio ragionevole per le richieste in cui ci si aspetta regolarmente lunghi tempi di elaborazione.

Il server può fornire a ciascuna richiesta un numero di serie e un registro delle richieste accettate ed elaborate e si verifica di volta in volta che la richiesta sia stata elaborata con il server.

    
risposta data 08.10.2016 - 22:30
fonte

Leggi altre domande sui tag