订阅者的 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 { }
你的代码中肯定有一些你没有给我们看的东西。
我正在使用 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 { }
你的代码中肯定有一些你没有给我们看的东西。