先声明,这篇文章并非是讲什么是继承什么是工厂模式,而是根据我工作的实际场景和优化思路做的总结
在键盘上键入正确地咒语,屏幕会活动、变幻,显示出前所未有的也不可能存在的事物!
这篇文章主要用来说说我们项目中待办事项v1.0需求的现实,以及后面版本V1.1、1.2、1.3版本的迭代优化的想法,是怎么一步一步做到更加人性化的功能,使其代码和逻辑更加合理化,模块与模块之间减少依赖,使其开发业务更加有独立性。这里的版本是由单一功能到多功能的进化,所以v1.1版本可能会很简单。
我先把所有版本文档罗列到这里:
iOS-继承-继承的工厂设计模式-多任务需求v1.1
iOS-继承-继承的工厂设计模式-多任务需求v1.2
iOS-协议-协议的工厂设计模式-多任务需求v1.3
先简单说说待办事项v1.1的需求:
需求:在App登录后,有5个业务需要去做,根据待办事项请求的接口返回的业务数据,做相应地处理,每次登录只处理一个业务,下次登录在处理另外一个业务,返回的业务数据中包含一个优先级,根据优先级最高的先处理,依次顺换,流程如下图:
v1.0第一次需求中,产品定义是固定的5个事项,所以v1.0版本就很简单,无非就是请求接口,做个判断,然后处理事项,就搞定,当然第一版也是很粗糙的一版。
- YxxAppLoginWaitWorking.m
//先是做了一个模型
#pragma mark - YxxAppLoginWaitWorkingDataListModel
@interface YxxAppLoginWaitWorkingDataListModel : HFModel
@property (nonatomic, strong) NSArray *taskList; /**< 信息列表 */
@end
@implementation YxxAppLoginWaitWorkingDataListModel
@end
#pragma mark - YxxAppLoginWaitWorkingModel
@interface YxxAppLoginWaitWorkingModel : HFModel
@property (nonatomic, copy) NSString *eventId; /**< 事件 ID*/
@property (nonatomic, copy) NSString *eventStep; /**< 事件步骤 */
@property (nonatomic, copy) NSString *eventStatus; /**< 事件状态 */
@property (nonatomic, copy) NSNumber *eventPri; /**< 事件优先级 */
@end
@implementation YxxAppLoginWaitWorkingModel
@end
@interface YxxAppLoginWaitWorking ()
@property (nonatomic, copy) NSMutableArray *minNumAry; /**< 保存优先级 */
@property (nonatomic, copy) NSMutableArray *eventIdAry; /**< 保存事件id */
@property (nonatomic, copy) NSMutableArray *eventStep; /**< 保存事件步骤 */
@end
@implementation YxxAppLoginWaitWorking
/**
* 数组懒加载
*/
- (NSMutableArray *)minNumAry
{
if (!_minNumAry) {
_minNumAry = [NSMutableArray array];
}
return _minNumAry;
}
- (NSMutableArray *)eventIdAry
{
if (!_eventIdAry) {
_eventIdAry = [NSMutableArray array];
}
return _eventIdAry;
}
- (NSMutableArray *)eventStep
{
if (!_eventStep) {
_eventStep = [NSMutableArray array];
}
return _eventStep;
}
//单例
+ (instancetype)shareInstance
{
static YxxAppLoginWaitWorking *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^(void) {
instance = [[YxxAppLoginWaitWorking alloc] init];
});
return instance;
}
/**
* 待办事项的数据请求
*/
- (void)showAppLoginWaitWorking
{
//登录态的监听
[RACObserve([YxxAppContext instance], isLogin) subscribeNext:^(id x) {
if ([x boolValue]){
//登录成功,请求待办事项数据
[self requestWaitWorking];
}
}];
}
/**
* 登录成功,请求待办事项数据
*/
- (void)requestWaitWorking
{
//发起请求
[request sendRequestWithComplete:^(NSDictionary *info, YxxRequestModel *requestModel, ECallBackStatus status) {
NSError *err;
//当请求成功后,下面做的事情,是将各个字段的数据分别存放到上面定义的数组中
if (status == ECallBackStatus_Succ) {
id model = requestModel.dataModel;
if ([model isKindOfClass:[YxxAppLoginWaitWorkingDataListModel class]]) {
NSArray *taskList = ((YxxAppLoginWaitWorkingDataListModel *)model).taskList;
YxxAppLoginWaitWorkingModel *model;
//上面一部分基本就是在解析json,然后遍历,分离数据
for (NSDictionary *dict in taskList) {
model = [MTLJSONAdapter modelOfClass:[YxxAppLoginWaitWorkingModel class] fromJSONDictionary:dict error:&err];
//存放到各自数组
[self.minNumAry addObject:model.eventPri];
[self.eventIdAry addObject:model.eventId];
[self.eventStep addObject:model.eventStep];
}
//请求接口中返回4个事项,本地需要添一个事项
[self.minNumAry addObject:@"1011"];
[self.eventIdAry addObject:@"事件5"];
[self.eventStep addObject:@"事件5"];
//找出最小的数字,也就是优先级最高的事项
NSNumber *minNum = [self numberWithMinNum:self.minNumAry];
NSInteger index = [self.minNumAry indexOfObject:minNum];
[self displayAppLoginWaitWorkingViewWithInfo:self.eventIdAry[index] andEventStep:self.eventStep[index]];
//清除数组中的id,避免有缓存数据
[self.minNumAry removeAllObjects];
[self.eventIdAry removeAllObjects];
[self.eventStep removeAllObjects];
}
}
}];
}
- (void)displayAppLoginWaitWorkingViewWithInfo:(NSString *)eventId andEventStep:(NSString *)eventStep{
/**
* 事件1
*/
if ([eventId isEqualToString:@"事件1"]) {
NSLog(@"%@",事件1);
}
/**
* 事件2
*/
if ([eventId isEqualToString:@"事件2"]) {
NSLog(@"%@",事件2);
}
/**
* 事件3
*/
if ([eventId isEqualToString:@"事件3"]) {
NSLog(@"%@",事件3);
}
/**
* 事件4
*/
if ([eventId isEqualToString:@"事件4"]) {
NSLog(@"%@",事件4);
}
/**
* 事件5
*/
if ([eventId isEqualToString:@"事件5"]) {
NSLog(@"%@",事件5);
}
}
/**
* 返回数组中最小值,有朋友会想为什么不用数组中[[arr valueForKeyPath:@"@max.intValue"] integerValue];这个方法找寻数组最小数,因为这里的数据是有0011,是一定包含前面0的,所以只有自己写方法,保证数据完整性
*/
- (NSNumber *)numberWithMinNum:(NSArray *)ary
{
NSNumber *num = nil;
for (int i = 0; i[ary[i+1] integerValue]) {
num = ary[i+1];
}
}
return num;
}
@end
到这里待办事项的v1.0需求很简单就完成了,但是这中间有很多坑,有很多可以优化的地方,也有很多可以做的更加人性化的地方。v1.0版本真的没有什么可以说的,请往下面看吧,iOS-继承-继承的工厂设计模式-多任务需求v1.2