Implementazione di un metodo che non restituisce mai gli stessi dati due volte

2

Ho un'applicazione mobile che recupera il x numero di ContentItems da un'API Web, tuttavia ho bisogno di un modo per visualizzare solo il contenuto che l'utente non ha mai visto sullo schermo. (Per essere chiari, l'utente vedrà sempre un singolo elemento di contenuto una sola volta.)

Immagina che la classe di contenuti sia così:

public class ContentItem 
{
    public int ID {get; set; }
    public string Foo {get; set; }
}

Posso pensare a due modi per implementarlo, entrambi con gravi inconvenienti a lungo termine:

1. Restituendo x numero di contentItems , quindi confrontandolo con un elenco di ID contenuto memorizzato internamente che l'utente ha già visto.

Restituisci il x ContentItems più recente dall'API, quindi confronta questi elementi con un elenco (Mobile side SQLite DB) di ID's memorizzato internamente che rappresenta gli elementi di contenuto che l'utente ha già visto. Se l'ID di uno degli articoli restituiti corrisponde a un ID memorizzato nel database, rimuoverlo dall'elenco ContentItem .

Nota: se l'API restituisce 100 elementi di contenuto e l'utente ne ha visti 3, visualizzerò solo i 97 nuovi elementi. Questo vale anche per l'inverso, (97 visto, 3 nuovi) poiché ho un meccanismo che rileva quando l'utente sta esaurendo il contenuto, quindi esegue il metodo 'getContent' in modo asincrono.

Svantaggi:

  • Che cosa succede se l'utente ha visto tutto il contenuto restituito dall'API? La risposta ovvia qui è di rieseguire il metodo che raccoglie i dati, ma questo ha implicazioni sulle prestazioni. (Se è un utente molto pesante, potremmo finire per eseguire il metodo più volte per ottenere nuovi contenuti.) Anche questo sembra un po 'ridondante poiché non abbiamo idea di quale contenuto stiamo per tornare.

2. Invio di un elenco di ID di contenuti visualizzati al server per garantire che vengano restituiti solo nuovi contenuti

In questo metodo, utilizzerei l'elenco memorizzato internamente di Content ID che l'utente ha visto e lo invieremo all'API Web prima di inviare la richiesta di getData . L'API assicurerebbe quindi che i dati restituiti non corrispondano a un ID presente nell'elenco dei contenuti visti in precedenza.

Inconvenienti

  • Invio di due richieste: ciò significa che inizialmente devo pubblicare l'ID di ogni contentItem che l'utente abbia mai visto all'API, quindi creare una richiesta GET per restituire effettivamente nuovi dati. (Non sono sicuro di quanto sia effettivamente un inconveniente, ma un problema con questo metodo significherebbe che l'id non è in grado di inviare in modo asincrono le richieste - Come faccio a sapere quando il server ha finito di analizzare l'elenco di id per inviare la richiesta di ottenere per esempio?)

  • Per utenti molto pesanti, potrei pubblicare un elenco enorme di ID (specialmente dopo 3 anni di utilizzo dell'App, ad esempio), questo potrebbe portare a problemi di prestazioni.

Vale la pena notare che ho il controllo totale sull'API e sull'app e che l'API serve solo l'app - Non ci sono altre dipendenze.

Se qualcuno ha qualche feedback sul metodo con cui andrebbero (o con qualsiasi metodo alternativo) lo apprezzerei molto!

    
posta KidCode 30.12.2015 - 14:34
fonte

2 risposte

4

Se hai il pieno controllo sulla generazione dell'ID e sull'ordine in cui il contenuto è presentato, allora deve essere possibile garantire che se guardo il ContentItem con ID 42, allora ho già visto il ContentItem s con ID da 0 a 41.

In questa situazione, puoi utilizzare una semplice variante di # 2: nella richiesta GET al server, invia l'ID del primo elemento invisibile (o l'ultimo visto) e lascia che il server restituisca gli elementi da quell'ID in poi .

    
risposta data 30.12.2015 - 16:09
fonte
5

Perché non considerare

3. Invia un ID utente e consenti al server di capire cosa inviare.

Questo ottimizzerà il traffico di rete in modo significativo: invierai sempre al server un'informazione unica di dimensioni fisse e recupererai solo i dati che effettivamente utilizzerai.

Hai il vantaggio aggiunto che se succede qualcosa al dispositivo dell'utente (o che vogliono vedere il tuo contenuto su più di un dispositivo) puoi fare la cosa giusta.

    
risposta data 30.12.2015 - 15:13
fonte

Leggi altre domande sui tag