public IObservable <T> FetchData <T>(RestSettings <T> settigns) { return(Task.Run(async() => { using (var httpResult = await _httpClient.SendAsync(settigns.RequestMessage)) { var data = await httpResult.Content.ReadAsStringAsync(); var parsedData = settigns.Parser.Parse(data); return parsedData; } }).ToObservable()); }
public async Task <T> SendAsync <T>(RestSettings <T> settigns, Func <Tuple <T, DateTimeOffset?>, bool> fetchPredicate = null, Action <T> beforeLoading = null, Action <Exception> onError = null) { var key = Utility.Md5Calculator.ComputeMd5(settigns.RequestMessage.RequestUri.OriginalString); bool?reload = null; var cachedValue = default(T); var createdItem = await BlobCache.LocalMachine.GetObjectCreatedAt <T>(key); if (createdItem == null) { reload = fetchPredicate?.Invoke(Tuple.Create(default(T), createdItem)) ?? true; } else { cachedValue = await BlobCache.LocalMachine.GetObject <T>(key); } var value = cachedValue; if (settigns.Mode == RequestAccessMode.Cache) { return(value); } reload = reload ?? fetchPredicate?.Invoke(Tuple.Create(value, createdItem)) ?? true; if (reload.Value) { try { beforeLoading?.Invoke(cachedValue); value = await FetchData(settigns); } catch (Exception ex) { value = cachedValue; onError?.Invoke(ex); } await BlobCache.LocalMachine.InsertObject(key, value, DateTimeOffset.Now.AddDays(10)); } return(value); }