Reactive Extensions, Akavache и Refit - это слишком много для внутренней карты Windows Phone
Я хочу использовать https://github.com/paulcbetts/refit в моем приложении и https://github.com/akavache/Akavache.
Проблема в том, что, согласно моей логике, Windows Phone не нравится, что я делаю следующее:
Я получаю семестр (из кэша, затем выбираю), выбираю требуемый семестр (я ставлю H2014 для тестирования), получаю расписание для выбранного (Много) семестра (из кэша, затем выбираю, как показано ниже:
var defer = Observable.Defer(() =>
BlobCache.Secure.GetAndFetchLatest("Semesters", () => _api.GetSemesters())
.Select(x => x.Single(semester => semester.AbredgedName == "H2014"))
.SelectMany(currentSemester => BlobCache.Secure.GetAndFetchLatest("Schedule_" + currentSemester.AbredgedName,
() => _api.GetSchedule(currentSemester.AbredgedName)))
);
defer.Subscribe(scheduleVms => {
foreach (var activity in scheduleVms)
{
Debug.WriteLine("1 {0}", activity.Name);
}
});
Observable.Timer(TimeSpan.FromSeconds(4)).Subscribe(_ =>
{
defer.Subscribe(scheduleVms => {
foreach (var activity in scheduleVms)
{
Debug.WriteLine("2 {0}", activity.Name);
}
});
});
Если я использую TimeSpan.FromSeconds 5 или более, он делает то, что я хочу, как будто я даю Windows Phone время, чтобы дышать. Иначе (до 5 лет), я получаю следующее исключение:
Возникло исключение: System.NotSupportedException в файле mscorlib.ni.dll StackTrace:
at MS.Internal.Modern.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at System.IO.Stream.<BeginEndReadAsync>b__d(Stream stream, ReadWriteParameters args, AsyncCallback callback, Object state)
at System.Threading.Tasks.TaskFactory`1.FromAsyncTrim[TInstance,TArgs](TInstance thisRef, TArgs args, Func`5 beginMethod, Func`3 endMethod)
at System.IO.Stream.BeginEndReadAsync(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Stream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.Net.Http.DelegatingStream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.Net.Http.DelegatingStream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.IO.Stream.<CopyToAsyncInternal>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Refit.RequestBuilderImplementation.<>c__DisplayClass2a`1.<<buildCancellableTaskFuncForMethod>b__29>d__2c.MoveNext()
Разыскиваемое поведение:
- Получить кэшированный семестр -> Получить кэшированное расписание на этот семестр, получить расписание на этот семестр
- Выбрать семестр -> Получить кэшированное расписание на этот семестр, Выбрать расписание на этот семестр
Я старался:
- Цепочка акаваче / акаваче без рефита и все работает.
- Цепочка Выбирает GetSchedule и GetSemesters без https://github.com/akavache/Akavache, и это работает.
Если у вас, ребята, есть идея по поводу работы или что-то, что я делаю не так, дайте мне знать!