Трябва ли да предпочитам NSNotificactionCenter или .NET събития, когато използвам Monotouch?

Когато разработваме в Monotouch, "по-добре" ли е за нас истински .NET events или NSNotificationCenter?

Прост пример: имам UIViewController. Той предлага събитие „CallbackWhenDisappeared“. Това събитие се задейства в ViewDidDisappear. Който проявява интерес може да се регистрира за събитието.

Мога също така да публикувам „MyFancyControllerHasDisappeared“ на NSNotificationCenter и да оставя на заинтересованите обекти да се абонират там.

Коя версия е за предпочитане?

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

Също така харесвам хлабавото свързване при използване на NSNotificationCenter в сравнение със събитията, при които класовете наистина трябва да се познават.

Има ли грешен или правилен начин да го направите?


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


Отговори (2)


Няма наистина правилно или грешно, но според мен изглежда така:

NotificationCenter - Не знаете кои обекти се интересуват от „Събития“, вие го изпращате и всеки обект може да го получи

.Net събития - Ако има директна връзка между два обекта, използвайте това, например като 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