public static IUniTaskSource <U> Create(T target, Func <T, U> monitorFunction, IEqualityComparer <U> equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) { if (cancellationToken.IsCancellationRequested) { return(AutoResetUniTaskCompletionSource <U> .CreateFromCanceled(cancellationToken, out token)); } if (!pool.TryPop(out var result)) { result = new WaitUntilValueChangedStandardObjectPromise <T, U>(); } result.target = new WeakReference <T>(target, false); // wrap in WeakReference. result.monitorFunction = monitorFunction; result.currentValue = monitorFunction(target); result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault <U>(); result.cancellationToken = cancellationToken; TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); token = result.core.Version; return(result); }
public static UniTask <U> WaitUntilValueChanged <T, U>(T target, Func <T, U> monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer <U> equalityComparer = null, CancellationToken cancellationToken = default(CancellationToken)) where T : class { var unityObject = target as UnityEngine.Object; var isUnityObject = target is UnityEngine.Object; // don't use (unityObject == null) return(new UniTask <U>(isUnityObject ? WaitUntilValueChangedUnityObjectPromise <T, U> .Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out var token) : WaitUntilValueChangedStandardObjectPromise <T, U> .Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out token), token)); }