加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

iOS体系的底层关照框架库

发布时间:2019-05-10 17:53:19 所属栏目:业界 来源:欧阳大哥2013
导读:调查者模式 调查者模式是一种用于解耦一系列必要彼此协作的类之间举办通讯的工具举动模式。它界说了工具之间的一种一对多的依靠相关。当一个工具的状态产生改变时,全部依靠于它的工具都将获得关照。调查者模式的实现一样平常分为两个步调:斲丧者注册关照动静
副问题[/!--empirenews.page--]

调查者模式

调查者模式是一种用于解耦一系列必要彼此协作的类之间举办通讯的工具举动模式。它界说了工具之间的一种一对多的依靠相关。当一个工具的状态产生改变时,全部依靠于它的工具都将获得关照。调查者模式的实现一样平常分为两个步调:斲丧者注册关照动静监听器、出产者发送关照动静。

iOS体系提供了多种对换查者模式的实现:在Cocoa Touch层通过NSNotification类和NSNotificationCenter类来实现关照动静的注册处理赏罚和发送,而在CoreFoundation层则提供了CFNotificationXXX系列的C函数来实现关照动静的注册处理赏罚和发送,而在操纵体系层面则通过libsystem_notify.dylib库提供了一套基于C说话的越发底层的关照动静注册和发送机制。

iOS体系的底层关照框架库

本文将重点先容libsystem_notify.dylib(往后简称为体系关照库)库中所提供用于实现关照动静注册和关照动静发送的各类接口函数。体系关照库中的关照动静注册和发送是可以用来实现跨历程通讯的一种底层的关照机制。

体系关照库的API

体系关照库中的全部函数都在notify.h文件中被声明,因此当你要行使体系关照库提供的函数时,必要在代码中#include 。正如其余全部基于关照动静的实现一样,每一种关照动静都通过一个字符串来举办标识,体系关照库中的关照动静也是云云。除此之外每个历程注册监听了一个关照动静时还会天生一个历程内有用的关照动静标识token。可以将token领略为历程在运行时对某个监听的关照动静的独一表征。体系关照库在处理赏罚关照动静时别离提供了: 基于block的处理赏罚器、基于mach port的动静端口、基于信号的处理赏罚、基于文件操纵的处理赏罚器一共四种处理赏罚方法。

一、关照动静的注册

体系关照库为支持上述四种动静处理赏罚机制,别离提供四个函数来实现各类处理赏罚范例的关照动静的注册:

  1. //基于block处理赏罚的关照注册 
  2. uint32_t notify_register_dispatch(const char *name, int *out_token, dispatch_queue_t queue, notify_handler_t handler) 
  3.  
  4. //基于信号处理赏罚的关照注册 
  5. uint32_t notify_register_signal(const char *name, int sig, int *out_token); 
  6.  
  7. //基于mach port动静的关照注册 
  8. uint32_t notify_register_mach_port(const char *name, mach_port_t *notify_port, int flags, int *out_token); 
  9.  
  10. //基于文件描写符的关照注册。 
  11. uint32_t notify_register_file_descriptor(const char *name, int *notify_fd, int flags, int *out_token); 

上述的四个函数可以看出,每个函数的第一个参数都是关照动静的名称,也就是我们想要监听的关照动静名称,而且每个函数都有一个out_token输出,用来标识历程在运行时注册的这个关照动静。对付block处理赏罚器而言,每次监听的关照被触发时总会在某个指定的queue中挪用指定的block函数;对付signal而言,每次监听的关照被触发时老是会向体系发出指定的信号;对付mach port而言,每次监听的关照被触发时老是会往指定的mach port端口发送一条空的mach msg动静;对付文件描写符而言,每次监听的关照被触发时老是会往指定的文件中写入特定的内容。

  • 体系关照库不只支持iOS体系还支持macOS体系,并且是跨历程的关照动静。可是一样平常环境下iOS体系只会用notify_register_dispatch函数来监听关照并通过block的方法举办处理赏罚,而macOS体系则全部的处理赏罚方法都可用。

二、关照动静的发送

当某个关照动静发生时,必要将关照动静发送给全部的监听者。关照动静的发送是通过函数notify_post来实现的:

  1. uint32_t notify_post(const char *name); 

函数的署名很简朴,入参就是关照动静名称。体系关照函数中的关照不会附带任何的附加参数。

三、关照动静监听者的停息、规复、打消

当注册某个关照动静时,体系会返回一个token值来标识这个关照信息。同时体系还别离提供了对关照动静监听的停息、规复、和打消处理赏罚:

  1. //关照的停息,配置后此token将暂且不会接管动静的关照。 
  2. uint32_t notify_suspend(int token) 
  3. //关照的规复,配置后此token将规复接管动静的关照。 
  4. uint32_t notify_resume(int token) 
  5. //关照的打消,配置后此token将不再接管动静的关照。 
  6. uint32_t notify_cancel(int token); 

四、关照动静发送检测

有的时辰我们并不想注册某个关照动静处理赏罚器来对关照举办处理赏罚,而只是想检测某个关照动静是否已经被发送过,为此体系提供两个函数来实现这成果:

  1. //注册一个关照动静检测的token。 
  2.  uint32_t notify_register_check(const char *name, int *out_token); 
  3.  
  4. //检测这个token所对应的关照动静是否被发送过。假如关照动静被发送过则check返回1,不然返回0。 
  5.  uint32_t notify_check(int token, int *check); 

五、关照动静的状态

对付关照动静的监听者来说,我们可以对返回的token绑定一个64位的状态数据。我们可以获取以及配置它。这个状态数据首要用来实现对关照监听者的扩展处理赏罚。

  1. uint32_t notify_set_state(int token, uint64_t state64) 
  2. uint32_t notify_get_state(int token, uint64_t *state64) 

六、体系预置的关照动静

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读