我的一部分认为我理解NSNotification概念。它是一个基于字符串的通知的集中式广播系统。张贴在一侧,在一侧或多侧观察并采取相应行动。然而,我的另一部分,必须编写代码的部分,每次我需要通知时都会感到困惑。什么样的代码进入哪个头/实现,什么文件实际上进行观察以及如何防止它变得混乱?是时候理顺了,你能帮我验证一下这些假设吗?我对第4名相当自信,但是第5名遇到了混乱的大奖。
self
传递到发布代码:[[NSNotificationCenter defaultCenter] postNotificationName:@"note name" object:self]
。正确的吗?@"MenuItemTapped"
,从B到C @"NavigateTo"
正确吗?NotificationNames.h
文件的内容,其中包含所有extern NSString *const NOTE_NAME
声明。然而,这破坏了通知的可移植性。#import
陈述。如何最大限度地减少拼写错误,同时保持常量/定义可移植?答案 0 :(得分:4)
你大多都得到了它。您的数字1-3通常是正确的。
extern NSString *const UIKeyboardDidShowNotification
声明的公共标题。在一些私有实现文件中是定义。 关于您上面#4的特别说明。将通知视为通知,而不是指示。他们通常捕捉状态变化或广泛有趣的事件。 “MenuItemTapped”是一个合理的通知,但“NavigateTo”通常不是,因为暗示是你告诉某个特定对象在某处导航。如果是这种情况,那个对象应该是想要导航的东西的委托(或者应该是属性),你应该让它直接发生。当然,这不是必需的,您可以根据需要使用该机制。但是Cocoa的设计模式通常不会使用“告诉对象做什么”的通知,只是为了“告诉谁关心会发生什么/做什么”。有意义吗?
最后,特别是:#4中的例子 - 那些听起来像真正的UI事件,似乎整个事情可以通过委托来处理,除非有一些理由说明为什么这些对象需要如此分离。
答案 1 :(得分:2)
如果您愿意,可以直接创建NSNotification
个对象。 postNotificationName:object:
只是一种为您创建,配置和发布通知对象的便捷方法。
您可以传递任何您喜欢的对象。其目的是允许通知订阅者仅接收有关特定对象的通知,因此理想情况下,您传递通知所针对的对象,通常 - 但不总是 - self
。
通知不是事件。它们是应用程序中的全球广播。
您不会向特定对象发送通知 - 它们是广播。如果要向特定对象发送消息,只需在该对象上调用方法即可。
头文件中的Externs很好。