<acronym id='f9e5a'><em id='f9e5a'></em><td id='f9e5a'><div id='f9e5a'></div></td></acronym><address id='f9e5a'><big id='f9e5a'><big id='f9e5a'></big><legend id='f9e5a'></legend></big></address>
    <ins id='f9e5a'></ins>
      <i id='f9e5a'><div id='f9e5a'><ins id='f9e5a'></ins></div></i>

    1. <tr id='f9e5a'><strong id='f9e5a'></strong><small id='f9e5a'></small><button id='f9e5a'></button><li id='f9e5a'><noscript id='f9e5a'><big id='f9e5a'></big><dt id='f9e5a'></dt></noscript></li></tr><ol id='f9e5a'><table id='f9e5a'><blockquote id='f9e5a'><tbody id='f9e5a'></tbody></blockquote></table></ol><u id='f9e5a'></u><kbd id='f9e5a'><kbd id='f9e5a'></kbd></kbd>
        <dl id='f9e5a'></dl>
        <fieldset id='f9e5a'></fieldset>

        <span id='f9e5a'></span>

        <code id='f9e5a'><strong id='f9e5a'></strong></code>

        <i id='f9e5a'></i>

        1. iOS系统的底层通知框架库

          • 时间:
          • 浏览:15
          • 来源:124软件资讯网

            视察者模式

            视察者模式是一种用于解耦一系列需要相互协作的类之间举行通讯的工具行为模式 。它界说了工具之间的一种一对多的依赖关系 。当一个工具的状态发生改变时 ,所有依赖于它的工具都将获得通知 。视察者模式的实现一样平常分为两个步骤:消耗者注册通知新闻监听器、生产者发送通知新闻  。

            iOS系统提供了多种对视察者模式的实现:在Cocoa Touch层通过NSNotification类和NSNotificationCenter类来实现通知新闻的注册处置惩罚和发送 ,而在CoreFoundation层则提供了CFNotificationXXX系列的C函数来实现通知新闻的注册处置惩罚和发送  ,而在操作系统层面则通过libsystem_notify.dylib库提供了一套基于C语言的越发底层的通知新闻注册和发送机制  。

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

            系统通知库的API

            系统通知库中的所有函数都在notify.h文件中被声明 ,因此当你要使用系统通知库提供的函数时  ,需要在代码中#include 。正如其它所有基于通知新闻的实现一样 ,每一种通知新闻都通过一个字符串来举行标识  ,系统通知库中的通知新闻也是云云  。除此之外每个历程注册监听了一个通知新闻时还会天生一个历程内有用的通知新闻标识token  。可以将token明白为历程在运行时对某个监听的通知新闻的唯一表征 。系统通知库在处置惩罚通知新闻时划分提供了: 基于block的处置惩罚器、基于mach port的新闻端口、基于信号的处置惩罚、基于文件操作的处置惩罚器一共四种处置惩罚方式  。

            一、通知新闻的注册

            系统通知库为支持上述四种新闻处置惩罚机制  ,划分提供四个函数来实现种种处置惩罚类型的通知新闻的注册:

            //基于block处置惩罚的通知注册
            uint32_t notify_register_dispatch(const char *name, int *out_token, dispatch_queue_t queue, notify_handler_t handler)
            
            //基于信号处置惩罚的通知注册
            uint32_t notify_register_signal(const char *name, int sig, int *out_token);
            
            //基于mach port新闻的通知注册
            uint32_t notify_register_mach_port(const char *name, mach_port_t *notify_port, int flags, int *out_token);
            
            //基于文件形貌符的通知注册  。
            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新闻;对于文件形貌符而言 ,每次监听的通知被触发时总是会往指定的文件中写入特定的内容  。