Mi chiedevo se qualcuno là fuori avesse suggerimenti generali su come strutturare un'app iOS supportata da un'API REST. Ci sono fondamentalmente due approcci a questo che ho pensato di
Chiamate API posizionate ad hoc nei controller della vista.
In questo approccio il controller di visualizzazione ha lo stato che recupera dal back-end come un oggetto User e quindi esegue il rendering del profilo dell'utente. Questo approccio è semplice in quanto non è necessario gestire alcuna sincronizzazione. Devi semplicemente recuperare i dati quando ne hai bisogno, come se stessi facendo il rendering di una pagina web.
Gli svantaggi di questo approccio sono duplici:
- Condizioni di gara nella visualizzazione / aggiornamento dei modelli
- Problemi di sincronizzazione con istanze di modelli in altri controller di vista
Per illustrare il primo punto, supponiamo di avere alcuni conteggi delle notifiche sul profilo utente. Quando visiti la pagina del profilo, recuperi l'oggetto utente ma desideri anche aggiornare l'utente quando visita una determinata scheda. Quindi hai due chiamate:
GET /rest/user # gets the user
POST /rest/user # clears notifications
Il risultato è una condizione di competizione tra il recupero dell'utente e l'aggiornamento del conteggio delle notifiche. Puoi recuperare un oggetto utente senza che i notificazioni siano cancellati.
Per il secondo punto, è possibile aggiornare l'oggetto utente, ma poi avere altri controller di visualizzazione che dipendono dall'oggetto utente aggiornato. In qualche modo è necessario comunicare l'aggiornamento a questi controller di visualizzazione.
Considera l'app come una cache con un archivio dati che si sincronizza con l'API
In questo approccio, tutti gli aggiornamenti e gli arresti del modello avvengono localmente tramite un'interfaccia dati. L'interfaccia dati decide quando sincronizzarsi al back-end e, se non ha alcuni dati localmente, blocca i chiamanti finché i dati non sono disponibili. Il lato negativo di questo approccio è che è più complicato, devi gestire l'invalidazione della cache e non mi è chiaro come implementare la sincronizzazione.
Voglio seguire questa strada, ma non sono sicuro di come procedere. Quindi, ho alcune domande:
- Questo archivio dati sembra l'approccio giusto?
- Esistono librerie che implementano un archivio dati come questo? O esempi di progetti che seguono questo percorso?
- I controller di visualizzazione possono recuperare istanze di oggetti attraverso l'archivio dati, ma questi controller di visualizzazione devono ancora essere a conoscenza degli aggiornamenti comunicati in qualche modo e non sono sicuro di come comunicare tali aggiornamenti.