在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 封装功能和逻辑思想的更多相关文章

  1. iOS封装功能生成 .framework

    前言 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为 ...

  2. iOS Simulator功能介绍关于Xamarin IOS开发

    iOS Simulator功能介绍关于Xamarin IOS开发 iOS Simulator功能介绍 在图1.38所示的运行效果中,所见到的类似于手机的模型就是iOS Simulator.在没有iPh ...

  3. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  4. [iOS]封装单例类

    [iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...

  5. iOS 添加功能引导图

    iOS 添加功能引导图 首次安装app之后,打开app首页,有一张功能引导图,其实最简单的一种做法是,直接在这个首页上加一个蒙层图片. 在蒙层上用气泡显示文字注明功能介绍,这个蒙层图片,让你们的UI设 ...

  6. cat /proc/cpuinfo 引发的思考--CPU 物理封装-物理核心-逻辑核心-超线程之间关系

    CPU的物理封装,一个物理封装使用独立的一个CPU物理插槽,共享电源和风扇: CPU物理核心:在一个物理封装中封装了多个独立CPU核心,每一个CPU核心都有自己独立的完整硬件单元. CPU逻辑核心:一 ...

  7. 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现

    CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成 ...

  8. iOS 封装SDK以及封装时bundle文件的处理

    这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...

  9. iOS手机功能汇总

    开发中经常会调用手机功能,今天来汇总一下,若有不足欢迎大家指出,下面分别介绍如下功能 : 电话 短信 邮件 通讯录 定位 跳转应用 跳转App Store 打开其他文件 电话 调用电话有下图两种不同样 ...

随机推荐

  1. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  2. 拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?

    写在前面 除了博文内容之外,和 netfocus 兄的讨论,也可以让你学到很多(至少我是这样),不要错过哦. 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领 ...

  3. hadoop 2.7.3本地环境运行官方wordcount

    hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...

  4. Linux虚拟机的安装(使用Centos6.3)

    1.什么是虚拟机? 虚拟机指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 2.安装Linux虚拟机前要做的准备 2.1:一台windows环境的pc 2.2:下载VM ...

  5. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  6. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  7. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  8. [C#] C# 知识回顾 - 学会使用异常

    学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...

  9. HIVE教程

    完整PDF下载:<HIVE简明教程> 前言 Hive是对于数据仓库进行管理和分析的工具.但是不要被“数据仓库”这个词所吓倒,数据仓库是很复杂的东西,但是如果你会SQL,就会发现Hive是那 ...

  10. python之最强王者(9)——函数

    1.Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...