Upload
santex-group
View
188
Download
1
Embed Size (px)
Citation preview
CÉSAR YNGA (ANDROID) Y RICARDO HERRERA (iOS)
COMO SOLUCIONAR
EN ANDROID
2 PROBLEMASCOMUNES
Y iOS
AGENDA1.Introducción
2.Configurar y distribuir para distintos ambientes
3.Manejar cache y sincronización de data
¿QUIENES SOMOS?
¡El Problema!
CONFIGURAR Y DISTRIBUIR PARA
DISTINTOS AMBIENTES
Diferentes Ambientes de desarrollo
¿Por qué?
● Permitir trabajo en paralelo de desarrollo y pruebas.
● Ahorra tiempo en configuraciones posteriores.
● Facilitar los cambios grandes para nuevos requerimientos.
● Diferenciación de errores (data, casos especiales, etc).
● No malograr la data de pruebas durante el desarrollo.
● Evitar problemas de pruebas en producción.
● Distribución para grupos específicos de testers.
Ambientes de desarrollo
Development
QA
Production
Configuración en Android Studio
Build types
Product flavors
https://developer.android.com/studio/build/index.html
Build variant
● Debug● Release
● Free● Paid
● Develop● QA● Staging● Production
● Free Debug● Free
Release● Paid Debug● Paid
Release
+
Configuración en Android Studio
src/main/
src/<buildType>/
src/<productFlavor>/
src/<productFlavorBuildType>/
Configuración en Android Studio
app/build.gradle
Configuración iOS
Configuración iOS
Configuración iOS
Distribución
Distribución para testers
¿PREGUNTAS?
¡El Otro Problema!
MANEJAR CACHE Y SINCRONIZACIÓN DE
DATA
Caché y Sincronización de Data
¿Por qué?
● Mejora la experiencia de usuario.● Permite tener la data actualizada.● Puede optimizar el uso el uso de internet
para la aplicación.● Permite información en modo offline.● Permite realizar procesos en modo offline.
Caché y sincronización
Server
Caché y Sincronización de Data
TiposSincronización
● Sincronización asíncrona.● Sincronización sincronico.
Almacenamiento de data● Almacenamiento parcial● Almacenamiento total
https://www.dre.vanderbilt.edu/~schmidt/PDF/PatternPaperv11.pdf
¿Cómo afrontarlo en Android?
http://fernandocejas.com/2015/07/18/architecting-android-the-evolution
Clean Architecture
https://github.com/ReactiveX/RxJavahttps://github.com/ReactiveX/RxAndroid
RxJava
RxAndroid
Reactive Programming
RxCache
Retrofit
http://square.github.io/retrofithttps://github.com/VictorAlbertos/RxCache
Repository Pattern
https://github.com/VictorAlbertos/RxCache
RxCache
interface Providers { Observable<List<Mock>> getMocks(Observable<List<Mock>> oMocks);
@LifeCache(duration = 5, timeUnit = TimeUnit.MINUTES) Observable<List<Mock>> getMocksWith5MinutesLifeTime(Observable<List<Mock>> oMocks);
Observable<List<Mock>> getMocksEvictProvider(Observable<List<Mock>> oMocks, EvictProvider evictProvider);
Observable<List<Mock>> getMocksPaginate(Observable<List<Mock>> oMocks, DynamicKey page);
Observable<List<Mock>> getMocksPaginateEvictingPerPage(Observable<List<Mock>> oMocks, DynamicKey page, EvictDynamicKey evictPage);
Observable<List<Mock>> getMocksPaginateWithFiltersEvictingPerFilter(Observable<List<Mock>> oMocks, DynamicKeyGroup filterPage, EvictDynamicKey evictFilter);}
https://github.com/VictorAlbertos/RxCache
RxCachepublic class Repository { private final Providers providers; public Repository(File cacheDir) { providers = new RxCache.Builder() .persistence(cacheDir, new GsonSpeaker()) .using(Providers.class); } public Observable<List<Mock>> getMocks(final boolean update) { return providers.getMocksEvictProvider(getExpensiveMocks(), new EvictProvider(update)); } public Observable<List<Mock>> getMocksPaginate(final int page, final boolean update) { return providers.getMocksPaginateEvictingPerPage(getExpensiveMocks(), new DynamicKey(page), new EvictDynamicKey(update)); } public Observable<List<Mock>> getMocksWithFiltersPaginate(final String filter, final int page, final boolean updateFilter) { return providers.getMocksPaginateWithFiltersEvictingPerFilter(getExpensiveMocks(), new DynamicKeyGroup(filter, page), new EvictDynamicKey(updateFilter)); } //In a real use case, here is when you build your observable with the expensive operation. //Or if you are making http calls you can use Retrofit to get it out of the box. private Observable<List<Mock>> getExpensiveMocks() { return Observable.just(Arrays.asList(new Mock(""))); }}
¿Y en iOS?
https://www.objc.io/issues/10-syncing-data/data-synchronization/
Asynchronous Client-Server
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html
Apple cache Policy
● NSURLRequestUseProtocolCachePolicy,● NSURLRequestReloadIgnoringCacheData, ● NSURLRequestReturnCacheDataElseLoad,● NSURLRequestReturnCacheDataDontLoad.
https://www.objc.io/issues/10-syncing-data/data-synchronization/
AFNetworking
Repository Pattern
¿PREGUNTAS? NO? NO? YA GO
santexgroup.com