文档章节

设计iOS平台CS架构客户端的基本框架-接收模式

木木情深
 木木情深
发布于 2013/12/19 20:20
字数 635
阅读 117
收藏 0

在发送特定的回应包给NNC之前还需要按照返回的包类型创建一个对象,这里使用工厂模式是比较自然的选择,原因是随着程序的开发,其回应包的类型肯定会不断的修改和增加,为了不影响客户端的代码,需要将返回包抽象,由工厂模式负责生产具体返回包

这里的返回包只需要满足可以发送给NNC就可以了,即满足拥有一个全局唯一的字符串,于是返回包的抽象类定义如下:

@interface Response:NSObject  

    @property (noatomic, copy, readonly) NSString *notificationID;  

@end   

而工厂模式的工厂基类需要满足按照不同的回应包类型生成不同的特定工厂,而各个工厂将生成不同的回应包(重载基类的方法),定义如下:

@interface ResponseCreator  

    // 生成特定的工厂对象  

    +(ResponseCreator*)responseCreatorWithType:(int)type;    

    // 需要子类重载的方法  

    -(Response*)responseWithData:(Byte*)data withLength:(unsigned)len;    

@end   

这样做的好处是当今后需要增加回应包的种类时,只需要添加一个特定的工厂类继承ResponseCreator,重载

-(Response*)responseWithData:(Byte*)data withLength:(unsigned)len;    

在ResponseCreator中保持着与其所有子类的联系,比如在responseCreatorWithType:的实现中有个switch-case语句,选择合适的工厂类,也可以使用类工厂的方式,从ResponseCreator中根据type直接返回Response的实例,但这样的话,其switch-case语句过于复杂,按照前面的方式可以将生成response的具体过程放到具体工厂中去实现,使得代码容易理解和维护,考虑到Response的构建过程需要解析数据流,各个特定的Response其解析的过程可以重用,我们使用生成器(Builder Pattern)来生成Response,Builder的父类如下:

@interface ResponseBuilder:NSObject  

@property (nonatomic, retain, readonly) Response *response;    

-(id)initWithData:(Byte*)data length:(unsigned)len;    

-(int)build;    

-(ResponseBuilder*)buildByte; 

-(ResponseBuilder*)buildShort; 

 -(ResponseBuilder*)buildUnsigned;  

-(ResponseBuilder*)buildString;  

@end   

其中的buildXXX分别解析不同类型的字段,在解析前会检查待解析数据流的长度,成功解析后数据流的指针(迭代器)向后移动相应的长度,解析失败将返回nil,各个子类生成器重载build方法生成各自的Response

现在再回到前面的发送回应包的地方,此时回应包已经生成,简单的执行如下代码即可:


[[NSNotificationCenter defaultCenter] postNotificationName:response.notificationID  object:response];  

本文转载自:http://blog.csdn.net/lymon01/article/details/7359873

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
亲爱的商界精英们 开发一个iOS应用没那么容易

这是来自新加坡的 iOS 开发者 Kent Nguyen 发表在1月底的一篇博文。这篇吐槽文在 iOS 开发圈子里流传甚广,从原文150多个评论就可见一斑,现翻译如下。让我们开门见山吧:做一个iPhone应用需...

红薯
2012/04/10
2.1K
13
分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面

此篇文章主要整理了最近在使用 Ionic 开发 Hybrid App 过程中遇到的一些疑难点以及后期发布生成 iOS 和 Android 版本过程中的种种问题。 文章目录 Ionic 简介和项目需求介绍 View 缓存的处理...

达摩院法师
2015/11/05
0
0
开发一个iOS应用没有那么容易

导读:这是来自新加坡的 iOS 开发者 Kent Nguyen 发表在1月底的一篇博文。这篇吐槽文在 iOS 开发圈子里流传甚广,从原文150多个评论就可见一斑,现翻译如下。   让我们开门见山吧:做一个i...

Orange1
2012/09/07
0
0
【北京/杭州】某互联网公司招聘ios/android开发10-20K

同志们: 一家大的互联网公司在杭州和北京招聘一些android开发和ios开发工程师啊,薪资待遇优厚,公司平台大大。 欢迎各位有才的GGJJ们光顾啊!也欢迎各位推荐,请客,哈哈! 本人QQ:254104...

谢静静
2011/11/24
704
2
面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课
2018/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis&memcached&SQL&NoSQL

Why 一个应用肯定有两部分逻辑:数据逻辑和业务逻辑。 数据逻辑包括各种I/O,和内部的数据的处理,也就是在内部如何组织数据结构,变量也属于这一部分。 当一个应用变成一个进程,它负责数据逻...

backbye
今天
2
0
什么时候使用字节流、什么时候使用字符流,二者的区别

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 InputStream 和OutputStream,...

watermelon11
今天
6
0
Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
今天
5
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
今天
5
0
Django学习笔记-从创建虚拟环境到启用服务

1 前置条件 windows系统下,目前已经完成anaconda3或miniconda3的安装,这也意味着已经完成了python3的安装。 2 创建虚拟环境 1、通过Anaconda Prompt,使用conda命令创建虚拟环境(base) e...

davidwbnu
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部