Events 使用Monotouch时,我应该更喜欢NSNotificactionCenter还是.NET事件?
在Monotouch中开发时,对我们来说real.NETEvents 使用Monotouch时,我应该更喜欢NSNotificactionCenter还是.NET事件?,events,xamarin.ios,nsnotificationcenter,Events,Xamarin.ios,Nsnotificationcenter,在Monotouch中开发时,对我们来说real.NETevents还是NSNotificationCenter“更好” 简单示例:我有一个UIViewController。它提供了一个事件“Callbackwhendiseared”。此事件在视图中触发。感兴趣的人可以注册参加活动 我还可以在NSNotificationCenter上发布一个“MyFancyController已消失”,让感兴趣的对象在那里订阅 首选哪个版本 我看到的.NET事件的缺点是:消失的控制器可能持有对订阅控制器的引用(
event
s还是NSNotificationCenter
“更好”
简单示例:我有一个UIViewController
。它提供了一个事件“Callbackwhendiseared”。此事件在视图中触发。感兴趣的人可以注册参加活动
我还可以在NSNotificationCenter
上发布一个“MyFancyController已消失”,让感兴趣的对象在那里订阅
首选哪个版本
我看到的.NET事件的缺点是:消失的控制器可能持有对订阅控制器的引用(或者反过来?),并且可能不会被垃圾收集
我还喜欢使用NSNotificationCenter时的松散耦合,而不是类必须相互了解的事件
做这件事的方法是对的还是错的?没有真正的对或错,但在我看来是这样的:
NotificationCenter-您不知道哪些对象对“事件”感兴趣,您发送它,任何对象都可以接收它
.Net事件-如果两个对象之间存在直接连接,请使用此选项,例如,就像UIViewController将另一个UIViewController显示为模态一样。ModalUIViewcontroller会触发一个事件,如果它将隐藏并且UIViewController被使用,则它会触发一个事件没有真正的对或错,但我认为它看起来是这样的:
NotificationCenter-您不知道哪些对象对“事件”感兴趣,您发送它,任何对象都可以接收它
.Net事件-如果两个对象之间存在直接连接,请使用此选项,例如,就像UIViewController将另一个UIViewController显示为模态一样。如果ModalUIViewcontroller将隐藏并且UIViewController已被使用,则ModalUIViewcontroller将触发一个事件我实际上更喜欢使用TinyMessenger。与NSNotifications不同,它作为框架的一部分为您处理调用的异步性
托管对象还允许更好的可调试性,特别是考虑到这些通常是跨容器调用,我发现这非常有用
var messageHub = new TinyMessengerHub();
// Publishing a message is as simple as calling the "Publish" method.
messageHub.Publish(new MyMessage());
// We can also publish asyncronously if necessary
messageHub.PublishAsync(new MyMessage());
// And we can get a callback when publishing is completed
messageHub.PublishAsync(new MyMessage(), MyCallback);
// MyCallback is executed on completion
事实上,我更喜欢使用TinyMessenger。与NSNotifications不同,它作为框架的一部分为您处理调用的异步性
托管对象还允许更好的可调试性,特别是考虑到这些通常是跨容器调用,我发现这非常有用
var messageHub = new TinyMessengerHub();
// Publishing a message is as simple as calling the "Publish" method.
messageHub.Publish(new MyMessage());
// We can also publish asyncronously if necessary
messageHub.PublishAsync(new MyMessage());
// And we can get a callback when publishing is completed
messageHub.PublishAsync(new MyMessage(), MyCallback);
// MyCallback is executed on completion
只是提醒大家.NET事件会创建强引用。请在中取消订阅,否则将导致内存泄漏,因为GC不知道如何清理这些对象。这就是为什么我认为最好为容器消息创建一个单例。只是提醒一下.NET事件会创建强引用。请在中取消订阅,否则将导致内存泄漏,因为GC不知道如何清理这些对象。这就是为什么我认为最好为容器消息传递创建一个单例。