iOS技术点iOS学习iOS 开发每天分享优质文章

推送消息 跳转到指定控制器

2016-09-09  本文已影响464人  gitKong

一、前言

没有封装工具类使用,delegate里面实现并处理逻辑,这显然不应该是delegate去做,造成delegate 冗余

面向字典开发,可复用性差,处理情况单一(json格式定死),逻辑处理不完善,数据获取麻烦且容易出错(需要写key,字符串容易出错,如果需要多次使用就更麻烦)


二、完善


三、API 设计

FLRemotePushModel 模型


/**
 *  @author Clarence-lie, 16-09-08 22:09:01
 *
 *  需要跳转的类名,后台返回
 */
@property (nonatomic,copy)NSString *className;
/**
 *  @author Clarence-lie, 16-09-08 22:09:38
 *
 *  字典转模型,可重写,根据不同格式转模型(如果重写,需要调用父类)
 *
 *  @param dict 后台返回的字典(json)
 *
 *  @return 返回一个模型
 */
+ (instancetype)fl_remotePushModel:(NSDictionary *)dict;

FLRemotePushManager 管理工具

/**
 *  @author Clarence-lie, 16-09-08 22:09:59
 *  创建单例对象,方便管理
 */
+ (instancetype)fl_shareInstance;
/**
 *  @author Clarence-lie, 16-09-08 22:09:59
 *
 *  根据模型内容跳转到指定界面
 *
 *  @param remotePushModel FLRemotePushModel子类
 */
- (void)fl_pushWithRemotePushModel:(FLRemotePushModel *)remotePushModel;

四、实现

大概思路:根据json数据创建模型 -> 工具类获取模型数据 -> 根据类名创建控制器实例对象 -> 获取模型对象属性名并存储到数组中 -> 遍历模型属性名数组并判断控制器实例对象是否有对应属性 -> 有对应属性则通过KVC赋值给控制器 -> 获取导航控制器进行跳转
定时器模拟推送消息
unsigned int outCount, i;
// 获取对象里的属性列表
objc_property_t * properties = class_copyPropertyList([instance class], &outCount);
/**
 *  @author Clarence-lie, 16-09-08 22:09:33
 *
 *  通过字符串来创建该字符串的getter方法
 *
 *  @param propertyName 属性名
 *
 *  @return 对应的getter方法
 */
- (SEL)fl_creatGetterWithPropertyName: (NSString *) propertyName{
    //1.返回get方法: oc中的get方法就是属性的本身
    return NSSelectorFromString(propertyName);
}
/**
 *  @author Clarence-lie, 16-09-08 22:09:49
 *
 *  获取指定属性名对应的值
 *
 *  @param propertyName 属性名
 *
 *  @return 属性值
 */
- (id)fl_getValueByPropertyName:(NSString *)propertyName{
    //获取get方法
    SEL getSel = [self fl_creatGetterWithPropertyName:propertyName];
    
    if ([self respondsToSelector:getSel]) {
        
        //获得方法的签名
        NSMethodSignature *signature = [self methodSignatureForSelector:getSel];
        
        //从签名获得调用对象
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
        
        //设置target
        [invocation setTarget:self];
        
        //设置selector
        [invocation setSelector:getSel];
        
        //接收返回的值
        NSObject *__unsafe_unretained returnValue = nil;
        
        //发消息
        [invocation invoke];
        
        //接收返回值
        [invocation getReturnValue:&returnValue];
        
        return returnValue;
    }
    else{
        return nil;
    }
}

五、调用

调用起来很简单,只需要创建好对应的推送模型,然后执行 fl_pushWithRemotePushModel 方法就行

- (void)pushSecond
{
    // 跟服务端沟通好跳转对应的界面需要对应的参数以及格式
    NSDictionary *userInfo = @{
                               @"className": @"SecondViewController",
                               @"id": @"12",
                               @"content": @"测试推送内容消息"
                               };
    
    [[FLRemotePushManager fl_shareInstance] fl_pushWithRemotePushModel:[FLSecondVcRemoteModel fl_remotePushModel:userInfo]];
}

- (void)pushThird{
    // 非默认同一级的json格式,子类重写构造方法即可
    NSDictionary *userInfo = @{
                               @"className": @"ThirdViewController",
                               @"msg"      : @{
                                    @"name": @"clarence",
                                     @"age": @12
                                             }
                               };
    
    [[FLRemotePushManager fl_shareInstance] fl_pushWithRemotePushModel:[FLThirdVcRemoteModel fl_remotePushModel:userInfo]];
}

六、总结

上一篇下一篇

猜你喜欢

热点阅读