这个问题从网络包的内容,由于保密问题,我刚才所描述我的业余的想法。

基本的想法:

网络请求,我们应该能够使用基类BaseNetWork, 然后由派生类继承BaseNetWork,并实现一些特殊的方法。

一般标准的流程是传入block, 当网络请求完成后。通过block回调回来。这里叙述的关键不是怎样实现一个网络请求和回调block的相关内容,而是怎样取消请求。 一般基类会实现一个cancelNetWork方法。它依据自己的url进行cancel操作。

举例:

我们使用 DerivedNetWork* net = [DerivedNetWork alloc]init]; 在init方法中设置了自身的url。然后调用基类的sendRequest发送请求。 等待网络返回的回调。 假设须要取消请求,难道我们使用[net CancelNetWork];,这样肯定不好。

毕竟在其它的方法里面不能得到当前的net指针,保存成成员又没有必要。
于是大家会想到应该使用类名进行cancel操作。 即将cancelNetWork定义成类方法。而不是对象方法。

这就引入了一个新的问题, 类方法怎样获取到对象的url? 经过苦思冥想,有一天发现了objc_setAssociatedObject方法。又联想到类对象本身也是对象的思路,想到一个解决方式。

方案:

基类NetWork类的实现代码:

#define LSPerson_URL_Key @"LSPerson_URL_Key"

@implementation BaseNetWork

-(void)setUrl:(NSString *)url
{
objc_setAssociatedObject([self class], LSPerson_URL_Key, url, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
+(void)cancelRequest
{
NSString* url = objc_getAssociatedObject([self class], LSPerson_URL_Key);
NSLog(@"cancelRequestUrl:%@", url);
}
@end

上面基类有一个setUrl方法,供派生类的对象使用设置自身的url, 它将url绑定到self class的类对象上。 然后另一个cancelRequest类方法。它从当前类对象中读取到url,来进行真正的cancel操作。 通过这样的方式。派生类能够使用此类方法进行自由的取消请求操作了。

代码:

LPStudyRequest* lpReq = [[LPStudyRequest alloc]init];
lpReq.url = @"http://jiawei.com"; //能够看到日志的输出。不同的派生类能够得到不同的url。再使用此url传递给AF进行取消操作。 [LPStudyRequest cancelRequest];

总结:

上面是一个主要的给类加入变量的思想。 它在这个取消网络请求里面得到了非常好的应用。 我还将它用到防止自身提前释放, 仿C++的静态变量中。

请一定要注意: C++的静态变量和object-c里面用到的单例static是不一样的。 一个是属于类的静态变量,一个是属于全局程序的静态变量。 假设基类定义了静态变量。派生类继承的话, C++的派生类会非常好的继承下来。 OC的全部的派生类对象公有的是同一个内存款, 它可以考虑使用类对象,势必模拟这种情况。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

object-c计划tips-添加到类对象属性的更多相关文章

  1. python添加、修改、删除、访问类对象属性的2种方法

    1.直接添加.修改.删除.访问类对象属性 class Employee (object): empCount = 0 def __init__(self, name, salary) : self.n ...

  2. Method Resolve Order (MRO) - 类对象属性的解析顺序

    Method Resolve Order (MRO) - 类对象属性的解析顺序 Python 支持多重继承, 此时就需要解决按照何种顺序来解析属性的问题.类的继承关系在一个特殊的类属性中指定(__mr ...

  3. day 1类 对象 属性 方法

    1. 解决吃啤酒鸭的问题 第一种方式(面向过程): 1)养鸭子 2)鸭子长成 3)杀 4)作料 5)烹饪 6)吃 7)卒 第二种方式(面向对象): 1)找个卖啤酒鸭的人 2)给钱 交易 3)吃 4)胖 ...

  4. python类对象属性查找原理

    class Foo(object): def __init__(self): # 这是一个对象属性 self.obj_pro = 12 # 这是一类属性 c_pro = 11 # 这是一个静态方法 @ ...

  5. java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  6. 组合,Mixin,类、类对象、实例对象

    1.组合,将几个横向关系的组合在一起.所谓的组合就是将类的实例化放到新类里面,那么就将旧类组合进去了. class Turtle: def __init__(self, x): # 注意 init 前 ...

  7. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  8. 规则引擎集成接口(九)Java类对象

    Java类对象 右键点击“对象库” —“添加java类对象”,如下图: 弹出窗体,在文本框中输入类的全名“com.flagleader.test.Test”,选择该类型后确定,如下: 显示如下,勾选上 ...

  9. Python_getattr+__import__ 实现动态加载模块、类对象或函数

    __import__() 语法 __import__(name[, globals[, locals[, fromlist[, level]]]]) 参数 name -- 字符串,模块的导入路径 说明 ...

随机推荐

  1. 服务器编程入门(3)TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  2. C#的百度地图开发(三)依据坐标获取位置、商圈及周边信息

    原文:C#的百度地图开发(三)依据坐标获取位置.商圈及周边信息 我们得到了百度坐标,现在依据这一坐标来获取相应的信息.下面是相应的代码 public class BaiduMap { /// < ...

  3. struts(二)——struts框架实现的基本原理

    上一篇文章,我们介绍了MVC框架的基本原理,并指出了这个基本框架中存在大量if…else的问题.今天我们来介绍一下struts框架,让struts解决这个问题. 首先,看一下粗略的时序图: Actio ...

  4. Java-UrlRewrite中文api文档

    安装 1. 下载jar包, 并加入到WEB-INF/lib下 2. 在WEB-INF/web.xml中增加下面的配置 <filter> <filter-name>UrlRewr ...

  5. error C2504: “CActiveXDocControl”: 基类没有定义

    这样的错误,通常,第一个文件失败: 1.相互头包括 2.头文件秩序 此错误是编译错误,和"inclued头文件"有关 问题描写叙述 有三个头文件AgentSDK.h.AA.h.BB ...

  6. SQL Server :理解GAM和SGAM页

    原文:SQL Server :理解GAM和SGAM页 我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时 ...

  7. git pull VS git fetch&merge(good)

    从图中可以看到,git fetch和git pull的区别, git fetch 不会自动的将结果merge到本地,只是将远程版本同步到本地版本库,而不会merge到本地副本. git pull  将 ...

  8. JavaScript模式读书笔记 文章3章 文字和构造

    1.对象字面量     -1.Javascript中所创建的自己定义对象在任务时候都是可变的.能够从一个空对象開始,依据须要添加函数.对象字面量模式能够使我们在创建对象的时候向其加入函数.       ...

  9. cocos2d-x3.0数据结构

    1.cocos2d::Vector 1.头报价"CCVector.h"头文件. 2.保存的数据类型必须是cocos2d::Ref的子类. 3.实现是动态加入数据集合即链表.主要的使 ...

  10. 重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础

    原文:重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础 [源码下载] 重新想象 Windows 8 Store Apps (9) - 控件之 Sc ...