Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 使用Monotouch时,我应该更喜欢NSNotificactionCenter还是.NET事件?_Events_Xamarin.ios_Nsnotificationcenter - Fatal编程技术网

Events 使用Monotouch时,我应该更喜欢NSNotificactionCenter还是.NET事件?

Events 使用Monotouch时,我应该更喜欢NSNotificactionCenter还是.NET事件?,events,xamarin.ios,nsnotificationcenter,Events,Xamarin.ios,Nsnotificationcenter,在Monotouch中开发时,对我们来说real.NETevents还是NSNotificationCenter“更好” 简单示例:我有一个UIViewController。它提供了一个事件“Callbackwhendiseared”。此事件在视图中触发。感兴趣的人可以注册参加活动 我还可以在NSNotificationCenter上发布一个“MyFancyController已消失”,让感兴趣的对象在那里订阅 首选哪个版本 我看到的.NET事件的缺点是:消失的控制器可能持有对订阅控制器的引用(

在Monotouch中开发时,对我们来说real.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不知道如何清理这些对象。这就是为什么我认为最好为容器消息传递创建一个单例。