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



>我正在使用Xamarin.iOS开发聊天移动应用程序

我有一个名为 MessageServices 的类,它发出事件 MessageAddedToDB

我有一个名为 Services 的类,我在其中初始化 MessageServices 类

服务.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(( 方法中,我初始化了一个新的服务实例并订阅了它的可观察量

视图控制器.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类中的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 { }

你的代码中一定有一些你没有向我们展示的东西。

最新更新