Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Extensions and ReactiveUI

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Ana Betts Ana Betts
December 27, 2011

Reactive Extensions and ReactiveUI

Presentation given at MonoSpace 2011, http://www.reactiveui.net

Avatar for Ana Betts

Ana Betts

December 27, 2011
Tweet

More Decks by Ana Betts

Other Decks in Technology

Transcript

  1. A Model-View-ViewModel framework for WPF, Silverlight, and Windows Phone... ...that

    integrates the Reactive Extensions for .NET. What is ReactiveUI Tuesday, December 27, 11
  2. Write completely non-blocking UIs whose interactions are described in a

    declarative fashion, and be able to test long-running timelines instantly using virtual time Why is that cool? Tuesday, December 27, 11
  3. Not just limited to XAML! • ReactiveUI core works anywhere

    • ...but the Mono compiler wasn’t havin’ it • With some hacking, works on MonoTouch Tuesday, December 27, 11
  4. Code in XAML code-behind is untestable - let’s move as

    much of our behavior into a separate object that we can test, and abstract away commands from how they’re invoked (button clicks) MVVM Tuesday, December 27, 11
  5. LINQ is Awesome • Core of LINQ is the sequence

    (IEnumerable) • Operators create a “pipeline” - you put stuff in, get stuff out • new[] {1,2,3,4} .Where(x => x % 2 == 0) .Select(x => x * 10); >>> [20, 40] Tuesday, December 27, 11
  6. A Sequence is just some stuff in a particular order

    (We’ll come back to this later!) Tuesday, December 27, 11
  7. We can no longer write synchronous software in an async

    world. - Abraham Lincoln Tuesday, December 27, 11
  8. • Events aren’t composable • Creating a “DoubleClicked” event from

    the MouseDown and MouseUp events should be easy, but it’s not. ...it’s just always sucked. Tuesday, December 27, 11
  9. What is an Event? • If I watch “KeyUp” -

    what comes out of that? • Event arguments: “M”, “o”, “n”, “o” • Hmmm, that looks like some stuff in a particular order. Tuesday, December 27, 11
  10. IObservable<T> • We need a new interface though for Observable

    Sequences. • If IEnumerable<T> is a “list”, IObservable<T> is a “Future List” • IObservable<T> has exactly one method: IDisposable Subscribe(IObserver<T> subscriber) Tuesday, December 27, 11
  11. IObserver<T> • The equivalent to IEnumerator<T> • Three methods =

    three things an Observable can do: void OnNext(T value); void OnError(Exception ex); void OnCompleted(); Tuesday, December 27, 11
  12. Subject<T> • Subjects are Observables we can control by-hand -

    they are the List<T> of Rx. • LinqPad Demo! Tuesday, December 27, 11
  13. IObservable as a Future • IObservable also can practically represent

    a Future (i.e. like Task<T>), by returning an IObservable of length 1 and completing • Remember this, it’s important! Tuesday, December 27, 11
  14. Rx Async Methods • Just like TPL async methods always

    return Task<T>, Rx async methods always return IObservable<T> public IObservable<int> AsyncAdd(int a, int b) { return Observable.Start(() => return a+b); } Tuesday, December 27, 11
  15. Using Async Methods // Block until the async call comes

    back var result = asyncCall(17).First(); // Get the result async asyncCall(42).Subscribe(x => /* Do Stuff */); // Let’s try a list var results = new[]{17, 42, 87}.ToObservable() .SelectMany(x => asyncCall(x)) .ToList().First(); Tuesday, December 27, 11
  16. Finally, we get to RxUI • RxUI gives you three

    main things • An object that can be Observed (ReactiveObject) • An ICommand which implements IObservable • A collection that can be Observed (ReactiveCollection<T>) Tuesday, December 27, 11
  17. public ColorPickerViewModel() { IObservable<Color> colorValues = this.WhenAny( x => x.Opacity,

    x.Brightness, x.Hue, (opacity, brightness, hue) => Color.FromHSV(opacity.Value, brightness.Value, hue.Value)); colorValues.Subscribe(x => Console.WriteLine("Color is set to: {0}", x)); colorValues.ToProperty(this, x => x.FinalColor); } Tuesday, December 27, 11
  18. • This app consists of three things: An input (the

    query) An output (the array of images) A command (the “Search” button) Our ViewModel Tuesday, December 27, 11
  19. ReactiveCommand SearchButton { get; protected set;} string SearchText { get;

    protected set;} List<BitmapImage> ImagesToDisplay { get; set; } searchButton .Select(x => this.SearchText) .Where(x => String.IsNotNullOrEmpty(x)) .SelectMany(x => fetchImagesFromBingSearch(x)) .ToProperty(this, x => x.ImagesToDisplay); Thinking Functionally Tuesday, December 27, 11