protected void bindPreloading(List <FlooredAdProvider> placements) { if (placements.Count != 0) { ReactiveProperty <bool> highestFloorHasAd = placements.First().AdsReady; ReadOnlyReactiveProperty <long> source = (from r in highestFloorHasAd where !r select r into _ select ServerTimeService.NowTicks()).ToReadOnlyReactiveProperty(); UniRx.IObservable <long> source2 = (from _ in source select Observable.Return(0L).Concat(Observable.Interval(TimeSpan.FromSeconds(preloadNotAvailableWaitingPeriod))).TakeUntil(from r in highestFloorHasAd where r select r)).Switch(); FlooredAdProvider backFiller = placements.Last(); (from _ in source2 where !backFiller.AdsReady.Value select _).Subscribe(delegate { preload(backFiller); }).AddTo(_disposable); FlooredAdProvider[] flooredPlacements = (from p in placements where p != backFiller select p).ToArray(); if (flooredPlacements.Length > 0) { (from _ in source2 select(from p in flooredPlacements select UniRx.Tuple.Create(p, flooredPlacements.TakeWhile((FlooredAdProvider pr) => pr != p))).ToObservable().SelectMany((UniRx.Tuple <FlooredAdProvider, IEnumerable <FlooredAdProvider> > pair) => Observable.Return(pair).Delay(TimeSpan.FromSeconds(waitTimeForTheNextProvider * pair.Item2.Count())).SelectMany((UniRx.Tuple <FlooredAdProvider, IEnumerable <FlooredAdProvider> > p) => Observable.Return(p).TakeUntil(previousOrMeGotReady(pair.Item1, pair.Item2))))).Switch().Subscribe(delegate(UniRx.Tuple <FlooredAdProvider, IEnumerable <FlooredAdProvider> > p) { preload(p.Item1); }).AddTo(_disposable); } } }
public UniRx.IObservable <AdWatched> TryToShow(AdPlacement placement, FlooredAdProvider provider) { if (provider == null || !provider.AdsReady.Value) { AdWatched adWatched = new AdWatched(); adWatched.network = AdNetwork.None; adWatched.placement = placement; adWatched.result = V2PShowResult.Failed; return(Observable.Return(adWatched)); } string zone = provider.Zone.Value; int floor = provider.FloorValue.Value; AdStarted.Value = new AdWatched { network = provider.NetworkId, result = V2PShowResult.None, placement = placement, zone = zone, floorValue = floor }; return(from result in provider.Show() select new AdWatched { result = result, network = provider.NetworkId, placement = placement, zone = zone, floorValue = floor }); }
private UniRx.IObservable <string> providerInfo(FlooredAdProvider p) { return(from _ in p.FloorValue.Merge(from _ in p.Zone select 1) select p.ProviderInfo()); }