Example #1
0
 public MvxSubscriptionToken SubscribeOnThreadPoolThread <TMessage>(
     Action <TMessage> deliveryAction,
     MvxReference reference = MvxReference.Weak,
     string?tag             = null,
     bool isSticky          = false)
     where TMessage : MvxMessage
 {
     return(SubscribeInternal(deliveryAction, new MvxThreadPoolActionRunner(), reference, tag, isSticky));
 }
Example #2
0
        private MvxSubscriptionToken SubscribeInternal <TMessage>(
            Action <TMessage> deliveryAction,
            IMvxActionRunner actionRunner,
            MvxReference reference,
            string?tag,
            bool isSticky) where TMessage : MvxMessage
        {
            if (deliveryAction == null)
            {
                throw new ArgumentNullException(nameof(deliveryAction));
            }

            BaseSubscription subscription;

            switch (reference)
            {
            case MvxReference.Strong:
                subscription = new StrongSubscription <TMessage>(actionRunner, deliveryAction, tag);
                break;

            case MvxReference.Weak:
                subscription = new WeakSubscription <TMessage>(actionRunner, deliveryAction, tag);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(reference), "reference type unexpected " + reference);
            }

            lock (_locker)
            {
                if (!_subscriptions.TryGetValue(
                        typeof(TMessage), out Dictionary <Guid, BaseSubscription> messageSubscriptions))
                {
                    messageSubscriptions             = new Dictionary <Guid, BaseSubscription>();
                    _subscriptions[typeof(TMessage)] = messageSubscriptions;
                }
                MvxPluginLog.Instance?.Log(LogLevel.Trace, "Adding subscription {0} for {1}", subscription.Id, typeof(TMessage).Name);
                messageSubscriptions[subscription.Id] = subscription;

                PublishSubscriberChangeMessage <TMessage>(messageSubscriptions);
            }

            if (isSticky && _messageDictionary.ContainsKey(typeof(TMessage)))
            {
                deliveryAction.Invoke((TMessage)_messageDictionary[typeof(TMessage)]);
            }

            return(new MvxSubscriptionToken(
                       subscription.Id,
                       () => InternalUnsubscribe <TMessage>(subscription.Id),
                       deliveryAction));
        }
Example #3
0
        private MvxSubscriptionToken SubscribeInternal <TMessage>(Action <TMessage> deliveryAction, IMvxActionRunner actionRunner, MvxReference reference, string tag)
            where TMessage : MvxMessage
        {
            if (deliveryAction == null)
            {
                throw new ArgumentNullException(nameof(deliveryAction));
            }

            BaseSubscription subscription;

            switch (reference)
            {
            case MvxReference.Strong:
                subscription = new StrongSubscription <TMessage>(actionRunner, deliveryAction, tag);
                break;

            case MvxReference.Weak:
                subscription = new WeakSubscription <TMessage>(actionRunner, deliveryAction, tag);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(reference), "reference type unexpected " + reference);
            }

            lock (this)
            {
                Dictionary <Guid, BaseSubscription> messageSubscriptions;
                if (!_subscriptions.TryGetValue(typeof(TMessage), out messageSubscriptions))
                {
                    messageSubscriptions             = new Dictionary <Guid, BaseSubscription>();
                    _subscriptions[typeof(TMessage)] = messageSubscriptions;
                }
                MvxTrace.Trace("Adding subscription {0} for {1}", subscription.Id, typeof(TMessage).Name);
                messageSubscriptions[subscription.Id] = subscription;

                PublishSubscriberChangeMessage <TMessage>(messageSubscriptions);
            }

            return(new MvxSubscriptionToken(
                       subscription.Id,
                       () => InternalUnsubscribe <TMessage>(subscription.Id),
                       deliveryAction));
        }
Example #4
0
 public MvxSubscriptionToken SubscribeOnMainThread <TMessage>(Action <TMessage> deliveryAction,
                                                              MvxReference reference = MvxReference.Weak, string tag = null)
     where TMessage : MvxMessage
 {
     return(SubscribeInternal(deliveryAction, new MvxMainThreadActionRunner(), reference, tag));
 }
 public MvxSubscriptionToken SubscribeOnThreadPoolThread <TMessage>(Action <TMessage> deliveryAction, MvxReference reference, string tag)
     where TMessage : MvxMessage
 {
     return(SubscribeInternal(deliveryAction, new MvxThreadPoolActionRunner(), reference, tag));
 }
Example #6
0
 public MvxSubscriptionToken SubscribeAsync <TMessage>(Action <TMessage> deliveryAction, MvxReference reference = MvxReference.Weak)
     where TMessage : MvxMessage
 {
     return(SubscribeInternal(deliveryAction, new MvxAsyncActionRunner(), reference));
 }