iOS开发那些事-移动平台架构设计

Apple iOS MDM开发流程 一年前曾参与过中石油的一个移动平台项目,实现了通过MDM对iOS设备进行管理。由于苹果对于mdm这块的接口及开发流程只向几个合作伙伴进行了分享,并没有对具体实现的文档进行公开,所以国外有几个网站专门在做mdm设备的管理。现在把实现的过程分享给大家,希望能对大家有所帮助。 阅读详情

低耦合企业级系统架构设计

我们往往称JavaEE或.Net 开发的产品为“系统”,而移动平台(主要是:Android、iOS和Window Phone)开发的产品为“应用”。“系统”比较复杂,需要架构设计,而“应用”相对比较简单,这是不是意味着我们不需要考虑架构问题呢?

 

我 们首先了解一下企业级系统架构设计。软件设计的原则是提高软件系统的“可复用性”和“可扩展性”,系统架构设计采用层次划分方式,这些层次之间是松耦合的,层次的内部是高内聚的。降低耦合是软件设计的目标,能够设计出低耦合的系统,就意味着我们的系统具有“可复用性”和“可扩展性”。通用低耦合 JavaEE和.Net企业级系统架构图。

表示层是用户与系统交互的组件集合,用户通过这一层向系统提交请求或发出指令,系统通过这一层接收用户请求或指令,然后,将指令消化吸收后调用下一层,再将调用的结果展现到这一层。表示层应该是轻薄的不应该具有业务逻辑。

业务层是系统的核心业务处理层,负责接收表示层的指令和数据,消化吸收后,进行组织业务逻辑的处理,并将结果返回给表示层。

数据持久层是服务层用于访问数据库层,从设计规范上讲为了降低耦合度,服务层不应该具有访问数据库的代码,访问数据库的代码应该放到数据持久层中。

信息系统层,是系统的数据来源,可以是数据库、文件、遗留系统和网络数据。

移动平台的分层架构设计

移动平台的应用是缩小版本的系统,它也需要架构设计,但并非所有的应用都一定基于通用低耦合企业级系统架构,一般而言主要是涉及信息处理的应用才使用这种架构设计模式,例如:一些游戏有自己的游戏引擎,引擎也属于架构设计。iOS平台一般信息处理应用分层架构设计图。

表示层,iOS中的表示层是由UIKit Framework构成的,它包括我们前面学习的视图、控制器、控件和事件处理等内容;

业务逻辑层,采用什么框架要据具体的业务而定,但一般是具有一定业务处理功能的Objective-C和C++封装的类,或者是C封装的函数。

数据持久层,提供本地或网络数据访问,它可能是访问SQLite数据API函数,也可能是CoreData技术,或是访问文件的NSFileManager,或是网络通信等技术,采用什么方式要看信息系统层是什么。

信息系统层,就iOS而言它的信息来源分为:本地和网络。本地数据可以放入文件中也可以放在数据库中,目前iOS本地数据库采用SQLite3。网络可以是某个云服务,也可以是一般的Web服务。

基于同一工程的分层

架 构对于我们iPhone和iPad开发有着很现实的意义。如果我们要编写一个基于iOS(iPhone和iPad两个平台)“My备忘录”应用,它具有:增加、删除和查询备忘录的基本功能, “备忘录”应用用例图,分层设计之后,表示层可以有不同iPhone版和iPad版本,而且业务逻辑层、数 据持久层和信息系统层都可以公用。这样可以大大减少我们的工作量,这就是分层设计的好处。

iOS考虑iPhone和iPad两个平台,我们绘制了设计原型草图, iPhone版本的“My备忘录”应用设计原型草图。iPad版本的“My备忘录”横屏设计原型草图, iPad版本的“My备忘录”竖屏设计原型草图。

 

 

在iOS平台分层的具体做法有多种模式:基于同一工程的分层、基于一个工作空间不同工程的分层和静态链接库分层。本小节介绍基于同一工程的分层。

我 们在前文中已经介绍了构建自适应iPhone和iPad工程,就是我们现在要讲的基于同一工程的分层模式。请读“备忘录”应用的代码,实现过程这 里不做介绍,打开“MyNotes”工程,在Xcode工程导航面板有3个组:PresentationLayer、 BusinessLogicLayer和PersistenceLayer。创建这3个组的目的是把不同层中类放到对应的组中便于管 理, PresentationLayer是放置的表示层相关类,BusinessLogicLayer是放置的业务逻辑层的相关 类,PersistenceLayer是放置持久层相关类。

各 个层的下面再如何划分呢?我们可以按照业务模块划分,也可以按照组件功能划分。本应用中PersistenceLayer层就还要分成dao和 domain两个组,dao是放置数据访问对象的,该对象中有对数据访问的CRUD四类方法,为了降低耦合度dao一般要设计成为协议(或Java接 口),然后根据不同的数据来源采用不同的实现方式。domain组是实体类,实体是应用中的“人”、“事”、“物”等。

dao组中NoteDAO.h代码如下:

 

1.  @interface NoteDAO : NSObject 

2.   

3.  //保存数据列表 

4.   

5.  @property (nonatomic,strong) NSMutableArray* listData; 

6.   

7.  + (NoteDAO*)sharedManager; 

8.   

9.  //插入Note方法 

10.  

11. -(int) create:(Note*)model; 

12.  

13. //删除Note方法 

14.  

15. -(int) remove:(Note*)model; 

16.  

17. //修改Note方法 

18.  

19. -(int) modify:(Note*)model; 

20.  

21. //查询所有数据方法 

22.  

23. -(NSMutableArray*) findAll; 

24.  

25. //按照主键查询数据方法 

26.  

27. -(Note*) findById:(Note*)model; 

28.  

29. @end 

listData属性用于保存数据表中的数据,其中每一个元素都是Note对象,一个Note对象代表数据表中的一条数据。+ (NoteDAO*)sharedManager方法用于获得NoteDAO单例对象。dao组中NoteDAO.m代码如下:

 

1.  @implementation NoteDAO 

2.   

3.  static NoteDAO *sharedManager = nil; 

4.   

5.  + (NoteDAO*)sharedManager 

6.   

7.  { 

8.   

9.  static dispatch_once_t once; 

10.  

11. dispatch_once(&once, ^{ 

12.  

13. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

14.  

15. [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

16.  

17. NSDate *date1 = [dateFormatter dateFromString:@"2010-08-04 16:01:03"]; 

18.  

19. Note* note1 = [[Note alloc] init]; 

20.  

21. note1.date = date1; 

22.  

23. note1.content = @”Welcome to MyNote.”; 

24.  

25. NSDate *date2 = [dateFormatter dateFromString:@"2011-12-04 16:01:03"]; 

26.  

27. Note* note2 = [[Note alloc] init]; 

28.  

29. note2.date = date2; 

30.  

31. note2.content = @”欢迎使用MyNote。”; 

32.  

33. sharedManager = [[self alloc] init]; 

34.  

35. sharedManager.listData = [[NSMutableArray alloc] init]; 

36.  

37. [sharedManager.listData addObject:note1]; 

38.  

39. [sharedManager.listData addObject:note2]; 

40.  

41. }); 

42.  

43. return sharedManager; 

44.  

45. } 

46.  

47. //插入Note方法 

48.  

49. -(int) create:(Note*)model 

50.  

51. { 

52.  

53. [self.listData addObject:model]; 

54.  

55. return 0; 

56.  

57. } 

58.  

59.   

60.  

61. //删除Note方法 

62.  

63. -(int) remove:(Note*)model 

64.  

65. { 

66.  

67. for (Note* note in self.listData) { 

68.  

69. //比较日期主键是否相等 

70.  

71. if ([note.date isEqualToDate:model.date]){ 

72.  

73. [self.listData removeObject: note]; 

74.  

75. break; 

76.  

77. } 

78.  

79. } 

80.  

81. return 0; 

82.  

83. } 

84.  

85.   

86.  

87. //修改Note方法 

88.  

89. -(int) modify:(Note*)model 

90.  

91. { 

92.  

93. for (Note* note in self.listData) { 

94.  

95. //比较日期主键是否相等 

96.  

97. if ([note.date isEqualToDate:model.date]){ 

98.  

99. note.content = model.content; 

100.           

101.          break; 

102.           

103.          } 

104.           

105.          } 

106.           

107.          return 0; 

108.           

109.          } 

110.           

111.            

112.           

113.          //查询所有数据方法 

114.           

115.          -(NSMutableArray*) findAll 

116.           

117.          { 

118.           

119.          return self.listData; 

120.           

121.          } 

122.           

123.            

124.           

125.          //按照主键查询数据方法 

126.           

127.          -(Note*) findById:(Note*)model 

128.           

129.          { 

130.           

131.          for (Note* note in self.listData) { 

132.           

133.          //比较日期主键是否相等 

134.           

135.          if ([note.date isEqualToDate:model.date]){ 

136.           

137.          return note; 

138.           

139.          } 

140.           

141.          } 

142.           

143.          return nil; 

144.           

145.          } 

146.           

147.          @end 

NoteDAO实现采用了单例设计模式,这种设计与DAO设计模式没有关系,这主要是出于访问数据的方便。数据放置在listData属性中(本应该是从数据库中的,但是数据库访问技术我们还没有学习),CRUD方法也都是对listData的处理,而非数据库。

domain组中Note代码如下,它只有两个属性date是创建备忘录的日期,content是备忘录内容:

 

1.  // 

2.   

3.  //  Note.h 

4.   

5.    

6.   

7.  #import <Foundation/Foundation.h> 

8.   

9.    

10.  

11. @interface Note : NSObject 

12.  

13.   

14.  

15. @property(nonatomic, strong) NSDate* date; 

16.  

17. @property(nonatomic, strong) NSString* content; 

18.  

19.   

20.  

21. @end 

22.  

23.   

24.  

25. // 

26.  

27. //  Note.m 

28.  

29. #import ”Note.h” 

30.  

31.   

32.  

33. @implementation Note 

34.  

35.   

36.  

37. @end 

业务逻辑层BusinessLogicLayer中的类的设计一般是按照业务模块设计的,它的方法是业务处理方法,下面代码是NoteBL.h代码:

 

1.  @interface NoteBL : NSObject 

2.   

3.  //插入Note方法 

4.   

5.  -(NSMutableArray*) createNote:(Note*)model; 

6.   

7.    

8.   

9.  //删除Note方法 

10.  

11. -(NSMutableArray*) remove:(Note*)model; 

12.  

13.   

14.  

15. //查询所有数据方法 

16.  

17. -(NSMutableArray*) findAll; 

18.  

19.   

20.  

21. @end 

在NoteBL.h中定义了三个方法,之所以定义三个方法是根据我的业务需求决定的,业务需求可以参考的用例图。下面代码是NoteBL.m代码:

 

1.  @implementation NoteBL 

2.   

3.    

4.   

5.  //插入Note方法 

6.   

7.  -(NSMutableArray*) createNote:(Note*)model 

8.   

9.  { 

10.  

11. NoteDAO *dao = [NoteDAO sharedManager]; 

12.  

13. [dao create:model]; 

14.  

15. return [dao findAll]; 

16.  

17. } 

18.  

19.   

20.  

21. //删除Note方法 

22.  

23. -(NSMutableArray*) remove:(Note*)model 

24.  

25. { 

26.  

27. NoteDAO *dao = [NoteDAO sharedManager]; 

28.  

29. [dao remove:model]; 

30.  

31. return [dao findAll]; 

32.  

33. } 

34.  

35.   

36.  

37. //查询所有数据方法 

38.  

39. -(NSMutableArray*) findAll 

40.  

41. { 

42.  

43. NoteDAO *dao = [NoteDAO sharedManager]; 

44.  

45. return [dao findAll]; 

46.  

47. } 

48.  

49.   

50.  

51. @end 


AvFrame和AvPacket 在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。 阅读详情

相关推荐

Unity半透明物体景深失效?教你用双材质球方案完美解决(附完整Shader代码)

本文深入剖析了Unity中半透明物体导致景深效果失效的根本原因,即半透明物体默认不写入摄像机深度图。针对此问题,文章详细介绍了稳定高效的“双材质球”解决方案,通过为物体附加一个仅写入深度信息的不可见材质,完美修复景深效果,并提供了完整的Shader代码与实现脚本。

weixin_29010003的博客 381

IOS框架和服务

 在iOS中框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源。共享资源库定义应用程序可以调用的函数和方法。 iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer(触摸UI层)、MediaLayer(媒体层)、Core ...

weixin_30415113的博客 582

STM32 HAL库串口DMA接收不定长数据的两种实战方法:IDLE中断与超时管理详解

本文详细解析了STM32 HAL库中串口DMA接收不定长数据的两种实战方法:IDLE中断与超时管理。通过对比分析两种方案的硬件要求、响应速度和适用场景,为嵌入式开发者提供了高效可靠的串口通信解决方案,特别适用于智能家居、传感器网络等需要处理不定长数据包的应用场景。

weixin_30954265的博客 471

iOS总体框架介绍和详尽说明

总体介绍iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer(触摸UI层)、MediaLayer(媒体层)、Core Services Layer(核心服务层)、Core OS Layer(核心OS层)。

lover0920的专栏 7012

在PLC中将十六进制数据转换为浮点数(通常遵循IEEE 754标准)需要理解数据存储格式,并按以下步骤操作:

通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)指数位(8位):实际指数 = 存储值 - 127(偏移量)。:必须确认PLC的存储顺序(大端或小端),否则结果错误。将两个16位寄存器合并为32位数据,需注意。尾数位(23位):隐含前导1,实际值为。:确保32位数据在寄存器中连续且对齐。符号位(1位):0表示正,1表示负。:高位寄存器在前(如西门子PLC)。:低位寄存器在前(如三菱FX系列)。,误差因截断导致)。

K11mvp的博客 4417

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

iOS开发移动平台架构设计

http://www.cnblogs.com/iOS-Blog/archive/2013/04/24/3039482.html 表示层:UIkit Framework 视图 控制器 控件 事件处理 业务逻辑层:框架 各种封装的函数或者方法 数据持久层:访问SQLite数据的API函数 CoreData技术 访问文件的NSFileManager 等

ft6206的博客 424

AUTOSAR实战:手把手教你配置EthTsync模块,搞定车载以太网时间同步

本文详细解析AUTOSAR架构中EthTsync模块的配置方法,实现车载以太网时间同步。通过对比gPTP与PTP协议差异,提供从开发环境准备到参数配置、模块集成的全流程指南,并分享性能优化与调试技巧,帮助开发者实现微秒级同步精度,满足自动驾驶等高精度时间同步需求。

weixin_28736335的博客 374

Apollo-11不是版本号,而是系统可靠性契约

在嵌入式与实时系统工程中,'Apollo-11'已从航天代号演变为一种隐含硬性约束的系统命名范式——它本质是面向确定性时序、高可用冗余和跨节点状态同步的行为契约。其核心原理在于将抽象版本标识绑定到可量化的物理边界(如最大并发节点数、端到端延迟抖动阈值、功能安全认证基线),从而支撑车规级通信协议栈、工业AGV调度、多机协同仿真等对SLA极度敏感的场景。这种命名方式跳出了语义化版本(SemVer)和时间戳的模糊性,直接承载硬件兼容矩阵、向量时钟同步规则、资源占用上限等可执行技术承诺,使开发、测试与运维具备强上下

weixin_33866037的博客 179

OPCUA二(通过OPCUA服务器访问CPU)

摘要:本文介绍了使用UaExpert软件连接西门子PLC的OPC UA配置方法,包括IP地址设置(默认端口4840)、安全认证和证书信任流程。详细说明了数据访问操作,如变量拖拽监控和属性解读(NodeId、Value、状态码等)。特别强调连接仿真Advance7时需先启动实例。最后预告下章将讲解通过KerServer访问CPU。文章涵盖配置步骤、常见问题处理及实用技巧,适合工业自动化开发者参考。

欢迎来到RaymondLeigh的知识共享基地 1337

基于SVD矩阵分解的用户购物篮预测分析实战

基于SVD矩阵分解的用户购物篮预测分析实战

360

zls移动开发:移动平台开发支持

还在为移动端Zig开发缺乏IDE支持而烦恼吗?zls作为Zig语言的Language Server(语言服务器),为移动平台开发提供了强大的工具链支持。本文将带你全面了解zls在移动开发中的核心功能和使用技巧。 ## 移动平台构建支持 zls通过内置的构建系统分析器,完美支持移动平台的交叉编译。在[src/build_runner/shared.zig](https://link.gitcod

gitblog_01164的博客 563

最新Python爬虫实战(入门爬虫篇)——案例15:微博热搜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过 Python 爬虫技术,成功实现了对微博热搜 API 接口数据的批量爬取与 Excel 保存。代码采用模块化设计,包含接口请求、JSON 解析、数据提取、Excel 持久化等完整流程;通过模拟真实浏览器的请求头和 cookies,有效规避基础反爬策略,保证请求的稳定性。整个爬虫逻辑遵循“API请求 → JSON解析 → 数据提取 → 保存到Excel”的标准流程,与异步加载类网站的爬取范式高度一致。AJAX 接口抓包与分析。

努力让自己发光,对的人才能迎着光而来 7万+

SAP企业移动平台开发探索系列 - 序

大家都知道移动应用市场这几年很火,未来几年更火,企业移动应用市场绝对是未来的一大收入增长点。大家也知道SAP是传统ERP市场的领导者,而现在SAP在收购了Sybase和Syclo以后,当仁不让的成为企业移动市场的领导者。 最近花了点时间研究了一些SAP的移动平台相关的开发技术,把笔记整理一下,在这里和大家分享一下,计划写成一个系列,一起看看SAP移动平台为移动开发人员带来了哪些功能和特性。 下

Unplugged 2419

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

移动开发那点事之——三大移动平台的比较

  移动开发那点事——三大移动平台的比较 Windows Phone说iOS太封闭,又说Android太开放,其实Windows Phone现在也很封闭,有些功能也需要越狱。 关于Android: 我真想说,迟早会被她的太开放害死。 我用过Android2.3,我只讲三点: 1. 经常被一些auto start service烦死了!采用一些软件禁止后,不久后又服务重启了! 2.其...

iteye_19059的博客 189

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

移动开发那点事——三大移动平台的比较

移动开发那点事——三大移动平台的比较           Windows Phone说iOS太封闭,又说Android太开放,其实WindowsPhone现在也很封闭,有些功能也需要越狱。关于Android: 我真想说,迟早会被她的太开放害死。           我用过Android2.3,我只讲三点: 1. 经常被一些autostart service烦死了!采用一些软件禁止后,不久

翠微草堂 635

Redot Engine移动平台开发:Android和iOS游戏的最佳实践指南

🚀 **Redot Engine** 是一款强大的跨平台2D和3D游戏引擎,专为移动游戏开发而设计。本文将为您详细介绍如何在Android和iOS平台上使用Redot Engine开发高质量游戏,从项目设置到性能优化的完整流程。 ## 📱 Redot Engine移动开发环境搭建 ### Android平台配置 Redot Engine为Android平台提供了完整的开发支持。在项目中的

gitblog_00757的博客 1070
上一篇: 网络处理2-异步POST请求和同步请求
下一篇: IOS开发中的几种设计模式介绍
宇之楓鷙
博客等级 码龄17年 5粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值