>我正在使用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 { }
你的代码中一定有一些你没有向我们展示的东西。