Created
March 15, 2017 00:40
-
-
Save yuka1984/e91ea9a769551c26c4def5c2bb682a13 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace Reactive.Bindings.WeakExtentions | |
{ | |
public static class WeakReferenceExtentions | |
{ | |
public static IDisposable WeakSubscribe<T>(this IObservable<T> observable, IObserver<T> observer) | |
{ | |
return new WeakSubscription<T>(observable, observer); | |
} | |
public class WeakSubscription<T> : IDisposable, IObserver<T> | |
{ | |
private readonly WeakReference reference; | |
private readonly IDisposable subscription; | |
private bool disposed; | |
public WeakSubscription(IObservable<T> observable, IObserver<T> observer) | |
{ | |
reference = new WeakReference(observer, true); | |
subscription = observable.Subscribe(this); | |
} | |
public void Dispose() | |
{ | |
if (!disposed) | |
{ | |
disposed = true; | |
subscription.Dispose(); | |
} | |
} | |
void IObserver<T>.OnCompleted() | |
{ | |
IObserver<T> observer = (IObserver<T>) reference.Target; | |
if (observer != null) observer.OnCompleted(); | |
else Dispose(); | |
} | |
void IObserver<T>.OnError(Exception error) | |
{ | |
IObserver<T> observer = (IObserver<T>) reference.Target; | |
if (observer != null) observer.OnError(error); | |
else Dispose(); | |
} | |
void IObserver<T>.OnNext(T value) | |
{ | |
IObserver<T> observer = (IObserver<T>) reference.Target; | |
if (observer != null) observer.OnNext(value); | |
else Dispose(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment