iOS开发细节 | 通知怎么写?

2017 年 11 月 24 日 CocoaChina 无夜之星辰



前言


工作的这一年多时间里我见识了各种通知的写法,今天总结一下。


第一种:


最纯粹的,如:


[[NSNotificationCenter defaultCenter] postNotificationName:@"aNotification" object:nil];


第二种:


在PCH文件中写宏,如:


#define aNotification @"aNotification"


第三种:


写在.h文件中,如:


static NSString *const aNotification = @"aNotification";


第四种:


在.m中定义并且在.h中暴露出来,如:


.h文件:


extern NSString * const aNotification;


.m文件:


NSString * const aNotification = @"aNotification";


思考


除了第一种low到爆之外其余三种貌似都可以,但是最好的只有一种,哪种最好呢?


《禅与Objective-C编程艺术》里面提到:


当你定义你自己的 NSNotification 的时候你应该把你的通知的名字定义为一个字符串常量,就像你暴露给其他类的其他字符串常量一样。你应该在公开的接口文件中将其声明为 extern 的, 并且在对应的实现文件里面定义。

因为你在头文件中暴露了符号,所以你应该按照统一的命名空间前缀法则,用类名前缀作为这个通知名字的前缀。

同时,用一个 Did/Will 这样的动词以及用 "Notifications" 后缀来命名这个通知也是一个好的实践。


如:


// Foo.h

extern NSString * const ZOCFooDidBecomeBarNotification

 // Foo.m

NSString * const ZOCFooDidBecomeBarNotification = @"ZOCFooDidBecomeBarNotification";


抛开命名规范来说,这与上面提到的第四种写法一样,那么这样写的依据是什么?


官方文档推荐的是:


Notifications are identified by global NSString objects whose names are composed in this way:


[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification


For example:


NSApplicationDidBecomeActiveNotification

NSWindowDidMiniaturizeNotification

NSTextViewDidChangeSelectionNotification

NSColorPanelColorDidChangeNotification


官方文档明确的告诉了我们通知如何命名,但是并没有告诉我们通知写到哪,既然如此就看看苹果的API吧。


苹果自己的API:


UIKIT_EXTERN NSNotificationName const UITextFieldTextDidBeginEditingNotification;

UIKIT_EXTERN NSNotificationName const UITextFieldTextDidEndEditingNotification;

UIKIT_EXTERN NSNotificationName const UITextFieldTextDidChangeNotification;


这是UITextField.h文件里的内容,是不是一看就觉得逼格很高?和《禅与Objective-C编程艺术》里的写法一样,在.m中定义然后在.h中暴露出去,但是它用到了UIKIT_EXTERN和NSNotificationName这两个我并没用用到的单词(姑且叫单词吧。。。)


按理说我们遵循官方文档再仿照苹果API就可以写出完美的通知了,但是,UIKIT_EXTERN和NSNotificationName这两个单词我们能随便用吗?


先看看UIKIT_EXTERN是什么


#ifdef __cplusplus

#define UIKIT_EXTERN        extern "C" __attribute__((visibility ("default")))

#else

#define UIKIT_EXTERN            extern __attribute__((visibility ("default")))

#endif


是个宏定义,看不懂。



看不懂可以百度,百度之后大概了解了:


UIKIT_EXTERN简单来说,就是将函数修饰为兼容以往C编译方式的、具有extern属性(文件外可见性)、public修饰的方法或变量库外仍可见的属性。


UIKIT_EXTERN只是在extern的基础上增加了兼容性(不知道这样描述可以不),说明我们是可以使用的。


再看看NSNotificationName


typedef NSString *NSNotificationName NS_EXTENSIBLE_STRING_ENUM;


其实就是NSString *,我们当然可以用。


用NSNotificationName代替NSString *的好处是什么?直观。别人一看到NSNotificationName就知道你这是在定义一个通知。


拿两个相同的通知对比一下就清楚了:


UIKIT_EXTERN NSString * const ZOCCacheControllerDidClearCacheNotification;

UIKIT_EXTERN NSNotificationName const ZOCCacheControllerDidClearCacheNotification;


总结


结合《禅与Objective-C编程艺术》+官方文档+苹果API可以得出:


通知应该这样写:


1.命名符合通知专用格式


[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification


2.在.m中定义,并且在.h中暴露。


这是苹果API里的一个通知,是模板,以后就照着模板写吧:


UIKIT_EXTERN NSNotificationName const UITextFieldTextDidChangeNotification;


最后提供一个完整模板


// Foo.h

UIKIT_EXTERN NSNotificationName const ZOCFooDidBecomeBarNotification

 // Foo.m

NSNotificationName const ZOCFooDidBecomeBarNotification = @"ZOCFooDidBecomeBarNotification";


登录查看更多
0

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【机器学习课程】Google机器学习速成课程
专知会员服务
162+阅读 · 2019年12月2日
开源书:PyTorch深度学习起步
专知会员服务
49+阅读 · 2019年10月11日
一文看懂怎么用 Python 做数据分析
大数据技术
23+阅读 · 2019年5月5日
iOS自定义带动画效果的模态框
CocoaChina
7+阅读 · 2019年3月3日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Android P正式发布,你需要尽快做适配了
前端之巅
3+阅读 · 2018年8月7日
【校招之学长分享】在NVIDIA ASIC PD工作是怎么样的体验?
英伟达NVIDIA中国
49+阅读 · 2018年7月26日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
iOS高级调试&逆向技术
CocoaChina
3+阅读 · 2017年7月30日
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
Arxiv
4+阅读 · 2018年10月31日
Auto-Context R-CNN
Arxiv
4+阅读 · 2018年7月8日
Arxiv
7+阅读 · 2018年6月8日
Arxiv
3+阅读 · 2018年5月21日
Arxiv
3+阅读 · 2018年3月29日
Arxiv
7+阅读 · 2017年12月28日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【机器学习课程】Google机器学习速成课程
专知会员服务
162+阅读 · 2019年12月2日
开源书:PyTorch深度学习起步
专知会员服务
49+阅读 · 2019年10月11日
相关资讯
一文看懂怎么用 Python 做数据分析
大数据技术
23+阅读 · 2019年5月5日
iOS自定义带动画效果的模态框
CocoaChina
7+阅读 · 2019年3月3日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Android P正式发布,你需要尽快做适配了
前端之巅
3+阅读 · 2018年8月7日
【校招之学长分享】在NVIDIA ASIC PD工作是怎么样的体验?
英伟达NVIDIA中国
49+阅读 · 2018年7月26日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
iOS高级调试&逆向技术
CocoaChina
3+阅读 · 2017年7月30日
相关论文
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
Arxiv
4+阅读 · 2018年10月31日
Auto-Context R-CNN
Arxiv
4+阅读 · 2018年7月8日
Arxiv
7+阅读 · 2018年6月8日
Arxiv
3+阅读 · 2018年5月21日
Arxiv
3+阅读 · 2018年3月29日
Arxiv
7+阅读 · 2017年12月28日
Top
微信扫码咨询专知VIP会员