Должен ли я предпочесть события NSNotificactionCenter или .NET при использовании Monotouch?

При разработке в Monotouch нам «лучше» настоящие .NET events или NSNotificationCenter?

Простой пример: у меня есть UIViewController. Он предлагает событие "CallbackWhenDisappeared". Это событие запускается в ViewDidDisappear. Кому интересно, может зарегистрироваться на мероприятие.

С тем же успехом я мог бы опубликовать сообщение "MyFancyControllerHasDisappeared" на странице NSNotificationCenter и позволить заинтересованным объектам подписаться там.

Какой версии отдать предпочтение?

Недостаток событий .NET, который я вижу: исчезающий контроллер может содержать ссылку на подписавшийся контроллер (или наоборот?) и не может быть собран мусором.

Мне также нравится слабая связь при использовании NSNotificationCenter по сравнению с событиями, когда классы действительно должны знать друг друга.

Есть ли неправильный или правильный способ сделать это?


person Krumelur    schedule 30.09.2011    source источник


Ответы (2)


Нет действительно правильного или неправильного, но на мой взгляд это выглядит так:

NotificationCenter — вы не знаете, какие объекты заинтересованы в «событиях», вы отправляете их, и любой объект может их получить.

.Net Events. Если существует прямое соединение между двумя объектами, используйте это, например, как UIViewController показывает другой UIViewcontroller как модальный. ModalUIViewcontroller запускает событие, если оно будет скрыто и UIViewController подписан на него.

person mafis    schedule 01.10.2011
comment
Просто напоминание о том, что события .NET создают сильные ссылки. Пожалуйста, отмените подписку на них, иначе вы столкнетесь с утечками памяти, потому что GC не будет знать, как очистить эти объекты. Вот почему я считаю предпочтительным создание синглтона для контейнерных сообщений. - person Anuj; 17.10.2011

На самом деле я предпочитаю использовать 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

https://github.com/grumpydev/TinyMessenger

person Anuj    schedule 16.10.2011