基于Swift对Objective—C开发的移动应用程序优化

2018-01-19 11:35李亚欣蔡永香邓舒颖
软件导刊 2018年10期

李亚欣 蔡永香 邓舒颖

摘 要:针对动态页面代码编写冗长、前台数据库更新方式待优化等问题,基于Swift与Objective-C混编技术对早期Objective-C移动应用程序进行优化,既充分利用由Objective-C语言封装好的第三方工具,又利用Swift的语言特点,如属性观察器优化动态页面简化程序逻辑、提高软件各项性能等;对前台数据库设计进行优化,实现用户数据分开存储、数据库按需更新等功能。对优化后的程序进行测试,结果表明,应用功能得到完善,系统性能得到提高。

关键词:iOS;程序优化;Swift;Objective-C

DOIDOI:10.11907/rjdk.181106

中图分类号:TP392

文献标识码:A 文章编号:1672-7800(2018)010-0178-05

英文摘要Abstract:Some problems exist in the early mobile Apps based on Objective-C including tediously long code on dynamic pages,unreasonable updating methods for foreground database,etc.Therefore,this paper optimizes the early code programming by taking advantages of both Swift and Objective-C programming technology.This method can make the utmost of the excellent third-party tools encapsulated by Objective-C code as well as use Swift′s features of which is like using the Property Observer to simplify procedures and improving the performance of software and so on.In addition,it optimizes the foreground database design and achieves the functions of storing the user data separately,updating the database as needed,etc.And the experimental result indicates that the function of application is improved and the performance of system is enhanced after using this method.

英文關键词Key Words:iOS; program optimization; Swift; Objective-C

0 引言

随着移动互联网技术的发展,应用软件逐渐由PC端转向移动端[1],移动端应用尤其是iOS应用繁多。目前,相关研究多以设计为主,如赵杏杏[2]关于移动水利信息APP的设计与实现、王大鹏[3]基于iOS的外卖APP设计与实现、刘磊[4]基于iOS的校园OA管理系统设计、尚燕涛[5]基于iOS的移动诊所系统等,而对于应用过程中可能遇到的问题、相应解决方法及优化方案的研究相对较少。崔璨[6]基于iOS系统的MOOC学习APP优化策略研究,也只针对APP功能方面的优化,未考虑软件性能优化。曾晨曦[7]考虑了性能优化却缺乏具体事例分析。为此,本文结合具体事例研究了应用可能存在的问题及解决方法,不仅优化软件功能,而且对性能也加以考虑。

“油讯通”是一款面向油气行业的辅助办公类APP,提供油气行业资讯的便捷获取、通知公告的实时发送与接收、群组内部、员工之间的实时互动交流等功能[8],相继推出了Android及iOS版本,用户可分别在安卓市场及苹果AppStore上下载使用。早期的iOS版用Objective-C(之后简称ObjC)语言编写,ObjC由 C语言衍生,继承了C语言特性,是扩充C的面向对象编程语言。ObjC语言运行速度快,动态运行环境适合UI编程[9],并且累积了丰富的第三方工具,但其语法形式与主流语言差异大,对编写人员要求较高,语言安全性也略显不足。“油讯通”APP在测试运行一段时间后发现存在如下问题:①代码冗长,不利于后期管理维护;②运行速度和内存占用有待改善;③用户部分个人信息在同一部手机上不能按用户区分显示,如新闻信息是否被当前用户查看、用户的收藏信息等;④版本更新中涉及到前台数据库结构发生变化的版本,不能一键更新。

Swift是Apple公司在2014发布的一门开源编程语言,用来撰写Mac OS X和iOS应用程序[10]。Swift相较于ObjC语言具有更加安全、高效、便捷的特点,使用Swift语言能很好地提高软件性能、降低开发难度、优化多项应用功能,因此本文采用Swift语言进行优化处理。

1 Swift优化思路

优化过程不是将原有应用重建,而是在充分利用原有应用优点的同时,弥补其不足,增强其性能。与ObjC相较,Swift语言具有更加安全、高效、便捷的特点,继承了ObjC语言优点、规避其缺点并可与ObjC混合编写。

1.1 简化代码、优化速度与内存

Swift简化了ObjC晦涩的语法,如取消头文件改为点语法,不需要在行末添加“;”进行标记等。对基本语句如switch语句功能进行扩展,加入惰属性、计算属性、属性观察器等新元素,极大地拓展了编程思路,简化了程序固有逻辑。Swift综合了编译型语言和解释型语言优点,编译速度更快[11]。Swift提供的Playground功能可在撰写代码的同时实时显示运行结果,真正实现 “所见即所得”,提高了调试效率[12]。考虑到使用一些优秀且成熟的第三方工具如FMDB、AFNetworking等,有利于提高编程效率,而这些工具大多由ObjC语言编写、封装。因此,基于Swift与ObjC混编技术对“油讯通”APP进行优化,既能充分利用ObjC语言封装好的优秀第三方工具,又能利用Swift优秀的语言特点,减少开发时间,降低开发难度。

1.2 采用面向用户的多数据库存储模式

传统应用中前台仅存在一个SQLite数据库存储应用数据。当用户需要存储并显示个性化数据如操作印记时,仅通过在该数据库中创建多个用户数据表满足需求,无疑增加了开发人员甄别数据的难度,这种情况下依据用户创建与之对应的数据库是一个有效的解决方案。使用多数据库存储模式,将数据库名依据用户信息加以区分,库内数据表命名规则相同,程序中同一套逻辑操作可应用于不同用户的数据库。此外,为减少多数据库增加内存占用问题,为应用添加对非主要用户数据库的清理功能,以便对这些用户进行数据清理。

1.3 前台数据库版本按需更新

前台数据库用于满足基本数据存取,一般情况下数据结构不会发生改变,但有时随着应用需求的改变或版本变更,新版本可能会涉及到其中部分数据表结构的修改,应用更新时需要针对用户本地数据库状态按需执行更新操作。这需要开发人员一方面对前台数据库更新操作集中管理,另一方面按照一定的规范以及逻辑满足不同状态下应用的更新。

2 优化方法与实施

2.1 面向用户的多数据库存储模式

创建多个数据库管理多个用户的个人信息,如图1所示。用户登录时,依据用户信息查找是否存在用户数据库,根据查找结果选择连接已有数据库或创建新数据库,之后进行正常数据库操作,运行软件。

对比“油讯通”实现前后数据库状态。如图2(a)所示,原应用在安装后创建一个与应用相关联的数据库并以软件信息(软件名)命名该数据库;如图2(b)所示,根据不同用户创建多个与应用相关联的数据库,并结合软件信息与用户唯一信息(软件名_用户账户名)命名个人数据库。原用户登录时寻找并连接对应的数据库,新用户登录时以上述命名规则创建数据库,实现垃圾清理功能时也可以该命名规则寻找非主用户数据库进行清理操作。

2.2 前台数据库版本按需更新

2.2.1 本地数据库状态判断

不同用户手机上安装应用的版本不同,对应前台数据库的状态也存在差异,为使数据库更新时按需执行修改操作,需要对用户本地数据库状态进行判断。为此,需要在本地数据库中创建一个版本信息表用以存储本地数据库版本信息。数据库更新时提取该信息,依据该信息进行数据库对应的升级操作。升级完成后,更新表内版本信息,以避免下次升级时重复执行已完成的更新操作。

2.2.2 更新操作集中管理与实施

开发人员需要将升级操作集中管理以便应用提取到用户本地数据库的状态信息后,执行相应的升级操作。采用switch语句实现数据库状态的判断以及更新操作的集中管理。数据库版本信息使用递增数字进行记录,每个case对应一个版本下的升级操作,使用fallthrough实现case间“击穿”功能:

Switch dbVersion{

case 1:

//数据库更新操作1

//数据库版本信息更新为2

fallthrough

case 2:

//数据库更新操作2

//数据库版本信息更新为3

fallthrough

default:break

}

数据库更新时,提取本地数据库版本信息,利用switch找到对应的case,完成该case以及之后case中所有升级操作,同时修改对应版本信息。版本信息始终指向下一版本,使每次更新不会重复,直至升级至最新要求。此更新流程不适用于前期数据库设计存在重大漏洞、后期需要反复多次修改前台数据库的应用。更新操作见图3。

2.2.3 前台数据库整体运行流程

结合多数据库存储方式,前台数据库整体运行流程如图4所示。新建数据库时,以最新的表结构创建各数据表,并创建版本信息表存入当前最新信息;已经存在的数据库在连接后,需要判断是否需要更新。对数据库内无版本信息表的数据库,创建版本信息表存入初始信息,以该信息完成所有数据库更新操作。对于数据库内存在版本信息表的数据库,提取表内版本信息,以该信息执行所需的更新操作。这样,不管数据库处于何种状态均能使其达到最新需求。

2.3 动态页面优化

Swift具有许多便捷且适用的语法特点,属性观察器是其中一个优秀代表。属性观察器能监控和响应属性值变化,每当其属性值被设置就会执行相应操作[13]。

以聊天页面为例,该页面需要根据聊天形式(单人聊天或群组聊天)、信息形式(文字、图片或表情)、信息长度、信息发送方(本人或他人)、发送时間等多种条件动态改变页面布局。使用ObjC实现时,在判断上述多项条件后需要调用不同的操作函数并传递多个参数控制页面变化。而使用Swift优化时,只需使用属性观察器将所需操作封装,调用操作时对属性观察器简单赋值即可。

如图5所示,Swift工程中聊天页主要由UIViewController(ChatPage)控制器管理下的UITableView控件组成,每条信息作为一个UITableViewCell(ChatCell)进行填充。其中ChatCell样式如图6所示,空白部分为UIView(ContentView)控件,用于填充聊天内容。

在ChatCell类中使用如表1所示的4个属性观察器封装其动态变化,ChatPage类提供改变的条件以及控制UITableView的行高以适应ChatCell大小。实验证明,ChatCell类用属性观察器改写后,代码量较ObjC版的代码量减少近40%, ChatPage类代码量减少近50%,同时灵活性及易用程度都得到了优化。

3 优化效果分析

以Swift语言为编辑语言优化“油讯通”APP,在优化版本中使用面向用户型多数据库构建方式,在保证其它功能基本一致的前提下,进行ObjC版本和Swift版本的多项指标对比。

3.1 文件代码得到精简

ObjC中一个对象文件由后缀名为.m和.h两个文件组成,而Swift简化了头文件.h文件的创建,只需创建后缀名为.swift的一个文件,所以工程内文件数量显著减少。ObjC工程文件夹下包含1 085个文件,而Swift工程文件夹下仅包含441个文件。ObjC版工程大小为67.1MB,Swift版工程大小为44.3MB,Swift版工程大小较原版工程大小减少近30%。

3.2 安全隐患减少

Swift是注重安全性的强类型语言,它将很多ObjC语言中视为警告甚至正常(如类型间的隐式转换)的语法形式加以禁止,极大避免了其可能带来的安全隐患,将“错误扼杀在萌芽之中”[14]。在原版工程中存在近100多条警告提示,而Swift版工程中仅有一条,而且是在桥接第三方工具中出现的警告,这说明新版本在一定程度上减少了安全隐患。

3.3 内存占用量减少

运行时所产生的内存消耗可作为衡量应用性能的指标。一个运行良好的应用在完成固定操作时所占用的内存消耗应尽可能小,以保证应用及手机整体的运行流畅性[15-16]。本文以功能优化中前台数据库相关操作以及聊天界面相关操作为例,对这一指标进行了测试,测试环境如下:测试机器:MAC笔记本,测试系统:10.12.6,测试工具:Xcode8.2,测试平台:iPhone7虚拟器。

3.3.1 内存占用量对比

前台数据库相关操作主要集中在应用安装后首次启动、用户登录以及更换用户过程,因此分别运行两版本执行上述操作,并记录其运行时内存消耗。图7、图8分别为ObjC版和Swift版运行上述操作时内存消耗折线图,统计各个操作完成后测试值趋于稳定时(折线保存水平)的内存消耗量,见表1。操作过程中Swift版内存消耗均比ObjC版有所减少,最高可减少17.2%的运行内存占用。由此可知,结合Swift语言特性,搭建具备版本按需更新的面向用户型数据库,不仅增强了数据库能力而且可减少应用运行内存消耗,达到优化效果。

3.3.2 动态页面内存占用量对比

分别加载相同数量、相同内容的聊天信息,测试两版本聊天界面在运行时的内存消耗,如图9、图10所示。为排除软件登录及页面跳转等操作所消耗不同内存量的影响,可通过计算上述操作后的总内存消耗量减去跳转到聊天页面前的内存消耗量的内存增量值进行比较,得到ObjC版内存消耗45.4MB(108MB-62.6MB),Swift版内存消耗36MB(82.6MB-46.6MB),Swift版内存消耗较ObjC版减少约20.7%,内存消耗得以优化。

4 结语

本文以Swift和Objective-C混编技术对早期的 “油讯通”APP进行了优化,采用面向用户的多数据库存储模

式,以及对数据库进行版本管理、按需更新等方法,解决了原版本中代码冗长、内存占用量大、用户个人信息不能区分显示、版本不能一键更新等问题。对优化前后应用程序进行对比,结果表明,这种优化方法使文件代码得到了精简,减少了系统安全隐患,程序运行时内存占用量减少,软件性能得到了提高。

参考文献:

[1] 李亚格,兰诚栋.基于iOS的移动办公系统设计与性能优化[J].计算机工程,2016,42(7):22-26.

[2] 赵杏杏,张晓祥.移动水利信息APP模块的设计与实现[J].测绘工程,2014,23(7):46-50.

[3] 王大鹏.基于iOS的外卖APP设计与实现[D].南昌:南昌大学,2016.

[4] 刘磊,张贺,田家赫.基于IOS的校园OA管理系统设计[J].软件导刊,2015(1):113-114.

[5] 尚燕涛.基于IOS的移动诊所系统[D].广州:华南理工大学,2016.

[6] 崔璨,王朋娇,段婷婷.基于iOS系统的MOOC学习APP优化策略研究[J].软件导刊,2017,16(9):10-13.

[7] 曾晨曦,马蓁蓁,崔雪然.移动应用资源限制分析与iOS应用优化建议[J].现代电信科技,2016,46(4):10-18.

[8] 蔡永香,陈帆,周明,等.基于Android的辅助办公APP的设计与实现[J].嘉应学院学报,2017,35(5):13-16.

[9] 黄兢成.从Objective-C到Swift[J].程序員,2014(7):33-37.

[10] 杨雯.Swift语言研究[J].电子技术与软件工程,2015(11):254-255.

[11] 万木君.苹果公司的Swift语言应用前景研究[J].电子技术与软件工程,2014(23):66-66.

[12] 张帆.从Objective-C到Swift的软件移植研究及实现[D].北京:中国科学院大学,2015.

[13] Apple Inc.Welcome to swift.org[EB/OL].https://swift.org/.

[14] JOAB J.Apple unveils the swift language for iOS and OS X[J].Macworld,2014,31(9):11-12.

[15] 刘乐廷,李敬兆.IOS内存开发管理机制的研究[J].计算机与现代化,2013(3):196-199.

[16] 胡宗立,祝跃飞,马亚南,等.Cisco IOS内存管理及其脆弱性分析[J].计算机工程,2011,37(20):24-26.

(责任编辑:杜能钢)