IOS 封装功能和逻辑思想
在ios开发中,难免会用到helper的思想。这篇就简单讲解下关于helper的简单实用方法。
假设我们要做一个这样的界面:

会议分为四种情况:
- 未召开
- 正在召开
- 已结束
- 已取消
再看看逻辑关系:

编程联想:
当我们要开发某一种功能的时候,有的同学可能一上来就写代码,由于有一定的经验,可能很快就实现了功能,但遇到业务复杂的功能,这么做就很容易写出杂乱的代码。我的习惯是,不妨先画出逻辑图,如果能够事先确定一些大概的方法,就更好了,我们的目的就是使用精简的代码完成功能。
我们这个界面主要依赖Meeting模型,模型中我们用到几个关键的属性:
- status 会议的状态
- join 是否加入会议 0:未加入 1:不出席 2:已出席
- meetingtype 是否是视频会议
我们为了把逻辑封装到一个文件中,我们创建了QKYMeetingDetailHelper这个类。
我们需要通过一个方法,参数为Meeting模型,然后转换成我们想要的结果。
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent *)meeting
按照这个功能的设计,最终会有5种不同的界面呈现出来,也就是说会有5种结果。按照结果,我们设计了一个枚举MeetingDetailStatus
/*!
@discussion 按照业务的要求,会议详情目前会有5种不同的显示结果
* 1. 什么都不显示:会议已取消 || 已结束 || 正在召开或未召开的前提下是主持人且会议不是视频会议
* 2. 显示加入会议:未召开或正在召开 且不是主持人 join == 2
* 3. 显示发起会议:未召开或正在召开 且是是视频会议
* 4. 显示确认出席和不能出席:未召开或正在召开,且不是主持人 join == 0
* 5. 显示不出席:未召开或正在召开,且不是主持人 join == 1
*/
typedef NS_ENUM(NSUInteger, MeetingDetailStatus) {
MeetingDetailStatusNone,
MeetingDetailStatusJoin,
MeetingDetailStatusHold, //发起
MeetingDetailStatusIsJoin, //是否参加
MeetingDetailStatusRefuse, //不出席
};
ps:在编程中,当我们遇到一个事物可能有几种不同的情况的时候,我们就应考虑使用枚举了,在swift中枚举更加强大。
@interface QKYMeetingDetailHelper : NSObject
/**
* 根据会议模型解析出我们需要现在的转态
*
* @param meeting 会议模型
*
* @return 会议详情的状态
*/
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent * _Nonnull)meeting;
@end
在来看看实现方法:
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent *)meeting {
NSParameterAssert(meeting);
//根据Meeting模型中的status判断会议状态
// 0:未召开, 1:正在召开, 2:已结束, 3:已取消
// 已结束或者已取消
if (meeting.status.integerValue == 2 || meeting.status.integerValue == 3) {
return MeetingDetailStatusNone;
}else {
// 是否是主持人
BOOL isHost = meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
// 是否是是视频会议
BOOL isVideo = meeting.meetingRoom.meetingtype.integerValue > 0;
// 是主持人但不是视频会议
if (isHost && !isVideo) return MeetingDetailStatusNone;
// 是主持人且是视频会议
if (isHost && isVideo) return MeetingDetailStatusHold;
// 不是主持人且未选择是否出席
if (!isHost && meeting.join.integerValue == 0) return MeetingDetailStatusIsJoin;
// 不是主持人且已选择不出席
if (!isHost && meeting.join.integerValue == 1) return MeetingDetailStatusRefuse;
// 不是主持人且已选择出席
if (!isHost && meeting.join.integerValue == 2) return MeetingDetailStatusJoin;
}
return MeetingDetailStatusNone;
}
其实,这个逻辑算是比较简单的了,遇到复杂点的,或者方法重复调用的时候,我们可以这样写:
static BOOL getIsHost(QKYMeetingContent *meeting) {
return meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
}
我们不建议写成这样:
- (BOOL)getIsHost:(QKYMeetingContent *)meeting {
return meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
}
前边的写法更加像是c的写法。不但限制了访问的权限,而且表示这是一个私有方法,和其他的点击事件的方法区别开来。如果方法的调用频率很大,那么可以考虑使用内联函数来提高性能。
好了,使用方法就不介绍了,其实,怎么实现功能不重要,重要的是如何维护功能。helper就像一个管理者一样,负责他自己的那部分工作,如果功能需要改变,我们改变helper就可以了。
IOS 封装功能和逻辑思想的更多相关文章
- iOS封装功能生成 .framework
前言 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为 ...
- iOS Simulator功能介绍关于Xamarin IOS开发
iOS Simulator功能介绍关于Xamarin IOS开发 iOS Simulator功能介绍 在图1.38所示的运行效果中,所见到的类似于手机的模型就是iOS Simulator.在没有iPh ...
- 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...
- [iOS]封装单例类
[iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...
- iOS 添加功能引导图
iOS 添加功能引导图 首次安装app之后,打开app首页,有一张功能引导图,其实最简单的一种做法是,直接在这个首页上加一个蒙层图片. 在蒙层上用气泡显示文字注明功能介绍,这个蒙层图片,让你们的UI设 ...
- cat /proc/cpuinfo 引发的思考--CPU 物理封装-物理核心-逻辑核心-超线程之间关系
CPU的物理封装,一个物理封装使用独立的一个CPU物理插槽,共享电源和风扇: CPU物理核心:在一个物理封装中封装了多个独立CPU核心,每一个CPU核心都有自己独立的完整硬件单元. CPU逻辑核心:一 ...
- 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现
CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成 ...
- iOS 封装SDK以及封装时bundle文件的处理
这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...
- iOS手机功能汇总
开发中经常会调用手机功能,今天来汇总一下,若有不足欢迎大家指出,下面分别介绍如下功能 : 电话 短信 邮件 通讯录 定位 跳转应用 跳转App Store 打开其他文件 电话 调用电话有下图两种不同样 ...
随机推荐
- CSS3 border-radius边框圆角
在CSS3中提供了对边框进行圆角设定的支持,可对边框1~4个角进行圆角样式设置. 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- 【Web动画】SVG 实现复杂线条动画
在上一篇文章中,我们初步实现了一些利用基本图形就能完成的线条动画: [Web动画]SVG 线条动画入门 当然,事物都是朝着熵增焓减的方向发展的,复杂线条也肯定比有序线条要多. 很多时候,我们无法人工去 ...
- Mysql存储引擎及选择方法
0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- 【干货分享】流程DEMO-离职流程
流程名: 离职申请 流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebService.cs 流程说明: 流程中集成了webservic ...
- TabLayout + ViewPager
一.实现思路 1.在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0'compile 'com.android. ...
- git提交项目到已存在的远程分支
今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建. 之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...