iOS-继承-继承的工厂设计模式-多任务需求v1.1-Yxx

先声明,这篇文章并非是讲什么是继承什么是工厂模式,而是根据我工作的实际场景和优化思路做的总结

在键盘上键入正确地咒语,屏幕会活动、变幻,显示出前所未有的也不可能存在的事物!
这篇文章主要用来说说我们项目中待办事项v1.0需求的现实,以及后面版本V1.1、1.2、1.3版本的迭代优化的想法,是怎么一步一步做到更加人性化的功能,使其代码和逻辑更加合理化,模块与模块之间减少依赖,使其开发业务更加有独立性。这里的版本是由单一功能到多功能的进化,所以v1.1版本可能会很简单。
我先把所有版本文档罗列到这里:
iOS-继承-继承的工厂设计模式-多任务需求v1.1
iOS-继承-继承的工厂设计模式-多任务需求v1.2
iOS-协议-协议的工厂设计模式-多任务需求v1.3

先简单说说待办事项v1.1的需求:
需求:在App登录后,有5个业务需要去做,根据待办事项请求的接口返回的业务数据,做相应地处理,每次登录只处理一个业务,下次登录在处理另外一个业务,返回的业务数据中包含一个优先级,根据优先级最高的先处理,依次顺换,流程如下图:


待办事项v1.1

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


原创,请忽随意转载

你可能感兴趣的:(iOS-继承-继承的工厂设计模式-多任务需求v1.1-Yxx)