/// <summary>
        /// Tenta obter o dado em memoria do preloader, caso nao seja encontrado, executa o força a execucao do preloader para obter os dados, tenta obter os dados, e retorna.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="preLoaderService"></param>
        /// <param name="preLoaderName"></param>
        /// <param name="fetchFunc"></param>
        /// <returns></returns>
        public static async Task <T> GetOrInvokePreLoaderAsync <T>(this IPreLoaderService preLoaderService, string preloaderName, PreLoadParameters parameters = null) where T : class
        {
            var response = PreLoaderServiceCore.Instance.GetCachedPreLoadedData <T>(preloaderName, parameters);

            if (response != default(T))
            {
                return(response);
            }
            else //null
            {
                //Dispara a execucao do Preloader da implementacao do usuario
                var observable = PreLoaderServiceCore.Instance.InvokePreLoaderWithObservable <T>(preloaderName, parameters);
                observable.Subscribe(f => Debug.WriteLine($"Invoked {nameof(PreLoaderReactiveExtensions)}.{nameof(PreLoaderReactiveExtensions.GetOrInvokePreLoaderAsync)}"));

                await observable.ForEachAsync(x => Debug.WriteLine(x));

                //tenta obter o resultado resultante da execucao do preloader...
                response = PreLoaderServiceCore.Instance.GetCachedPreLoadedData <T>(preloaderName, parameters);

                return(response);
            }
        }
예제 #2
0
        public IObservable <RestCountriesModel[]> GetData(PreLoadParameters parameters)
        {
            var response = remoteDataService.GetDataAsync().ToObservable();

            return(response);
        }
        /// <summary>
        /// Tenta retornar o dado do cache do PreLoader e caso nao seja encontrado força a execucao do preloader para obter os dados, atualiza o cache do PreLoader e retorna os novos dados obtidos.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="preLoaderService"></param>
        /// <param name="preLoaderName"></param>
        /// <returns></returns>
        public static IObservable <T> GetOrInvokePreLoader <T>(this IPreLoaderService preLoaderService, string preLoaderName, PreLoadParameters parameters = null) where T : class
        {
            var fetch = Observable.Start <T>(() => PreLoaderServiceCore.Instance.GetCachedPreLoadedData <T>(preLoaderName, parameters), Scheduler)
                        .SelectMany(response => Observable.FromAsync(async() =>
            {
                if (response != null)
                {
                    return(response); //retorna o dado do cache do preloader
                }
                Debug.WriteLine($"====PreLoaderReactiveExtensions.GetOrInvokePreLoaderObservable() - Thread Id: {Thread.CurrentThread.ManagedThreadId}");
                //Forca a execucao do pre-loader...
                var observable = PreLoaderServiceCore.Instance.InvokePreLoaderWithObservable <T>(preLoaderName, parameters);

                await observable.ForEachAsync(x => Debug.WriteLine(x));

                //tenta obter o resultado do preloader...
                response = PreLoaderServiceCore.Instance.GetCachedPreLoadedData <T>(preLoaderName, parameters);

                return(response);
            }));

            return(fetch);
        }