在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. console的高级使用

    1.console.table()用来表格化展示数据. var people = { zqz: { name: 'zhaoqize', age: 'guess?' }, wdx: { name: 'w ...

  2. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  3. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  4. Javascript 代理模式模拟一个文件同步功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 第14章 Linux启动管理(2)_启动引导程序grub

    2. 启动引导程序grub 2.1 Grub配置文件 (1)grub中分区的表示 硬盘 分区 Linux设备文件名 Grub中设备文件名 第1块SCSI硬盘 第1个主分区 /dev/sda1 hd(0 ...

  6. 学习笔记:URL Protocol在浏览器中打开本地应用程序

    看到阿里的网站上可以通过点击卖家的旺旺图标从而调用本地的阿里旺旺程序,而且还可以传递当前浏览者需要咨询的商品.这是怎么实现的呢?是通过URLProtocol来完成. 原理还没有太清楚,即在系统里注册一 ...

  7. 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录

    在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...

  8. XCodeGhost表明:为了安全,开发工具应该从官方网站下载

    今天的热门话题就是XCode编译器,这个神器在火热的移动互联网浪潮下也被人利用了,据文章分析 (XCode编译器里有鬼 - XCodeGhost样本分析)http://www.huochai.mobi ...

  9. 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...

  10. 斗天斗地斗控件 -- 与 Flyout 控件的斗争史

    前言 在淘宝的收藏夹页面本地化过程中,收藏的宝贝和店铺的分类展示通过一个下拉菜单的方式进行展示.如果单独为此从头重写一个控件,那么不但费时费力,包括所有的动画方式都要全新设计,而且还容易出 bug.好 ...