订阅者的 onNext 操作未在 ViewDidLoad 中触发,但在相同 class 中触发

Subscriber's onNext action not fired in ViewDidLoad but fired in same class

我正在使用 Xamarin.iOS

开发聊天移动应用程序

我有一个名为 MessageServices 的 class 发出事件 MessageAddedToDB

我有一个 class 调用的服务,我在其中初始化 MessageServices class

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 操作和事件处理程序被触发

然而,当从 ViewController.cs 订阅 receivedMessageObservable 时,永远不会调用订阅者的 onNext 动作。

在 ViewController 的 ViewDidLoad() 方法中,我初始化了一个新的服务实例并订阅了它的可观察对象

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
    });
}

我还有其他可观察值,例如 Services class 中的 messageSuccessfullySentObservable,我在其中以与 receivedMessageObservable 相同的方式初始化它们。 ViewController 中的订阅者也像我对 receivedMessageSubscriber 一样进行初始化。其他订阅者的动作被解雇。

您的代码运行良好。试试这个:

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 { }

你的代码中肯定有一些你没有给我们看的东西。