AFNetworking 中观察者模式解析

0. Objective-C 中的观察者模式(KVO)

Objective-C 语言实现了观察者模式(Key Value Observing, KVO),并提供了简单的使用接口。

供给使用者方便的注册观察者,注册观察方法,移除观察者。

a. 注册观察者

/*
方法的接收者 objectA 是被观察者 objectB 观察的对象
方法的第一个参数 objectB 是注册到 objectA 上的观察者
方法的第二个参数 @”property“ 是被观察者 objectB 监听的属性,当该属性发生改变时,通知观察者做出反应
options: 有4个值,分别是:
NSKeyValueObservingOptionOld 把更改之前的值提供给处理方法
NSKeyValueObservingOptionNew 把更改之后的值提供给处理方法
NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。
NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。
 */
[objectA addObserver:objectB forKeyPath:@"property" options:NSKeyValueObservingOptionNew context:nil];

b. 实现观察者的观察方法

在观察者 objectB 的实现文件中添加观察方法

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSKeyValueChangeKey,id> *)change
                       context:(void *)contex
    // 在这里添加处理改变的逻辑
}

c. 移除观察者

//删除指定的key路径监听器
[self.person removeObserver:self forKeyPath:@"name"];
//删除指定的key路径监听器,只是多了context参数
[self.person removeObserver:self forKeyPath:@"name" context:nil];

1. 什么是 AFNetworking ?

AFNetworking 是 iOS 开发中使用最多的第三方网络库,封装了 iOS 原生网络请求。

其中使用了大量 KVO 来对属性改变做出反应。

2. 通过 AFHTTPRequestSerialization 类来说明观察者模式

代码地址 https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLRequestSerialization.m

在该类初始化方法 init 的最后,为其几个属性添加了观察者

for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
    if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
            [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext];
    }
}

将观察者设置为自己,观察的属性 keyPath 来自函数 AFHTTPRequestSerializerObservedKeyPaths()

static NSArray * AFHTTPRequestSerializerObservedKeyPaths() {
    static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))];
    });

    return _AFHTTPRequestSerializerObservedKeyPaths;
}

该函数使用了 Objective-C 中典型的单例模式写法,保证数组 _AFHTTPRequestSerializerObservedKeyPaths 只在第一次访问的时候初始化一遍

由于自己是这些属性的观察者,该类也要实现观察者的观察方法

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(__unused id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    if (context == AFHTTPRequestSerializerObserverContext) {
        if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
            [self.mutableObservedChangedKeyPaths removeObject:keyPath];
        } else {
            [self.mutableObservedChangedKeyPaths addObject:keyPath];
        }
    }
}

该方法在被观察属性改变的时候被调用,用以修改 mutableObservedChangeKeyPaths 属性

最后,在该类对象被回收时,移除观察者

- (void)dealloc {
    for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
        if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
            [self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext];
        }
    }
}

原文地址:https://www.cnblogs.com/svens/p/9837411.html

时间: 2024-10-18 10:02:18

AFNetworking 中观察者模式解析的相关文章

RxPermissions中观察者模式解析

RxPermissons是什么 RxPermissions是一款基于RxJava的Android动态权限管理库.Android从6.0开始引入动态权限管理,不同于以往的APP安装时就授权完毕,对于敏感权限必须由用户手动的在APP运行过程中授权.此举对用户十分友好,但是对于程序员来说就不得不对权限进行管理.如果使用系统原生的方法进行管理,一般方式如下 private void requestPermission() { if (ContextCompat.checkSelfPermission(t

Keyboard项目中观察者模式解析

该项目旨在解决输入框多层嵌套的情况下软盘和输入框位置不适配的问题. 项目的github源码链接为:https://github.com/crazycodeboy/KeyboardObserver/blob/master/KeyboardObserver/KeyboardObserver.m 一.观察者模式实现原理 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.当这个主题对象在状态发生变化时,会通知所有观察者对象,使得他们能够更新自己.在此项目中其实现原理主要体现在

NSXMLParser 在AFNetworking中的使用

好吧,一下博文转自:http://www.tuicool.com/articles/Qnmu6f 对xml进行解析的标准有两种:sax以及dom. 首先这两种标准并不是针对java的,他们在各种语言环境下都可以实现.dom是真正的国际标准.sax是事实的标准,它不由任何商业组织维 护,而是由一个非商业的组织在运作.就像iso7层模型和tcp/ip一样,虽然sax不是正式的标准,但是一点不影响其在xml解析领域的地位. dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里.在需要的时候

关于AFNetworking中header的bug问题

关于AFNetworking中header的bug问题 [摘要:AFNetworking那个正在ios开辟中便未几道了,网上一搜一大推,然则详细用法我便没有道了,偶然间我会整顿一下详细的一些用法.本日首要接头一下我正在应用傍边闭于header上里的一些bug问] AFNetworking这个在ios开发中就不多说了,网上一搜一大推,但是具体用法我就不说了,有时间我会整理一下具体的一些用法.今天主要讨论一下我在使用当中关于header上面的一些bug问题. 首先关于一个登录保持,我和服务器人员通过

iOS 中json解析数据出现中文乱码的问题

一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢? 一般都是通过转码来解决,但是直接转码,是不能达到效果的,例如 [jsonStringstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 这样直接转码是达不到效果的. 解析数据的时候,可以先把数据存放在NSdata对象中,

C# 将XML格式字符串,写入数据集的表中 XML解析

将XML格式字符串,写入数据集的表1中 命名空间:using System.Xml; string strRead;//strRead为以下xml值 XmlDocument xd = new XmlDocument(); xd.LoadXml(strRead); XmlNodeList nodeList = xd.SelectSingleNode("root").ChildNodes;//获取bookstore节点的所有子节点 foreach (XmlNode xn in nodeLi

WCF中配置文件解析

WCF中配置文件解析 2014-06-14 参考 WCF中配置文件解析 返回 在WCF Service Configuration Editor的使用中,我们通过配置工具自动生成了WCF服务端的config文件.现在我们来看下这个配置文件各个标签的意义: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!-- 这个程序集我们在项目中有引用的 --> 4

java中观察者模式Observable和Observer

25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到. 实际上以上的购房者就是观察者,他们所关注的房价就是被观察者 其中要求,被观察者需要继承Observable类,观察则需要实现Observer接口 具体实现如下 房价的实现 1 class House extends

json格式数据2中方式解析实例

json格式数据2中方式解析实例 json是移动平台上非常常用的数据传输格式,本示例提供了两种Json格式文件生成与解析的方式.第一种通过JsonReader和JsonWriter两个对象进行json文件的读写操作,需要sdk在11以上.第二种通过JSONArray.JSONObject.JSONTokener等对象进行json读写操作,需要sdk在9以上.这种方式也可通过引入jar包的方式在其他版本的sdk中实现.启动客户端后,先点击写入json按钮(第1或3个按钮)生成Json文件(位置为s