Действие подписчика onNext не сработало в ViewDidLoad, но сработало в том же классе - PullRequest
0 голосов
/ 24 июня 2019

Я работаю над мобильным приложением в чате, используя Xamarin.iOS

У меня есть класс MessageServices, который генерирует событие MessageAddedToDB

И у меня есть класс Services, в котором я инициализирую класс MessageServices

Services.cs

public MessageServices messageService;

public IObservable<ChatMessage> receivedMessageObservable;
public IObservable<ChatMessage> messageSuccessfullySentObservable;

public Services()
{
    messageService = new MessageServices();
    messageService.MessageAddedToDB += (message) =>
    {
        Debug.WriteLine(message.Message); //This gets fired
    }


   AddObservables();
}

public void AddObservables()
{
    receivedMessageObservable = Observable.FromEvent<MessageAddedToDBEventHandler, ChatMessage>(
    (handler) =>
    {
        MessageAddedToDBEventHandler messageAddedToDBEventHandler = (ChatMessage m) =>
        {
            handler(m);
        };
        return messageAddedToDBEventHandler;
    },
    ev => messageService.MessageAddedToDB += ev,
    ev => messageService.MessageAddedToDB -= ev);

    receivedMessageObservable.Subscribe(onNext: (m) =>
    {
        Debug.WriteLine(m.Message); // This gets fired
    }

    messageSuccessfullySentObservable = Observable.FromEvent<MessageSuccessfullySentEventHandler, ChatMessage>
        (
            (handler) =>
            {
                MessageSuccessfullySentEventHandler messageSuccessfullySentEventHandler = (ChatMessage m) =>
                {
                    handler(m);
                };

                return messageSuccessfullySentEventHandler;
            },
            ev => httpHandler.MessageSuccessfullySent += ev,
            ev => httpHandler.MessageSuccessfullySent -= ev
        );
}

Действие подписчика onNext и обработчик события запускаются

Однако при подписке на receiveMessageObservable из ViewController.cs действие подписчикаДействие onNext никогда не вызывается.

В методе ViewDidLoad () ViewController я инициализирую новый экземпляр Services и подписываюсь на его наблюдаемые

ViewController.cs

Services services;

IDisposable receivedMessageSubscriber;
IDisposable messageSentSubscriber;

public override void ViewDidLoad()
{
    services = new Services();
    AddSubscribers();
}

public void AddSubscribers()
{
    receivedMessageSubscriber =
        services
            .receivedMessageObservable
            .Subscribe(onNext: (m) =>
            {
                Debug.WriteLine(m.Message); //This doesn't get fired
            });

    messageSentSubscriber = 
         services
         .messageSuccessfullySentObservable.Subscribe((m) => {
           Debug.WriteLine(m.Message); //This gets fired
    });
}

У меня есть другие наблюдаемыенапример messageSuccessfullySentObservable в классе Services, где я инициализирую их так же, как receivedMessageObservable.Подписчики в ViewController также инициализируются так же, как и в receivedMessageSubscriber.Действия других подписчиков увольняют.

1 Ответ

1 голос
/ 24 июня 2019

Ваш код работает отлично. Попробуйте это:

void Main()
{
    var messageService = new MessageService();

    var messageReceivedObservable = Observable.FromEvent<MessageAddedToDBEventHandler, ChatMessage>(
        handler =>
        {
            MessageAddedToDBEventHandler messageAddedToDBEventHandler = (ChatMessage m) =>
            {
                handler(m);
                return m;
            };
            return messageAddedToDBEventHandler;
        },
        ev => messageService.MessageAddedToDB += ev,
        ev => messageService.MessageAddedToDB -= ev
    );

    messageReceivedObservable
    .Subscribe((message) =>
    {
        Console.WriteLine(message);
    });         

    messageService.Raise();
    messageService.Raise();
}

public delegate ChatMessage MessageAddedToDBEventHandler(ChatMessage m);

public class MessageService
{
    public event MessageAddedToDBEventHandler MessageAddedToDB;
    public void Raise()
    {
        this.MessageAddedToDB?.Invoke(new ChatMessage());
    }
}

public class ChatMessage { }

В вашем коде должно быть что-то, что вы не показали нам.

...