美文网首页
2020-02-19

2020-02-19

作者: 超级黑 | 来源:发表于2020-02-19 19:09 被阅读0次

    经过这三个月的学习java

    我发现java的框架真的很好

    比如 连接数据库的dao层,spring框架可直接利用接口和配置文件创建一个对象,而这个对象实现了接口的函数.

    我思考了一些时间,真正动手却是昨天,经过两天一夜的奋战,终于整理出来一份很垃圾的小demo.

    这个思想呢,到底是叫IOC还是aop,我不知道,我只知道,给定一个未实现的接口(objective-c中叫协议)就能实现这些方法的声明.

    创建一个接口(oc叫协议)

    =======================================

    #import <Foundation/Foundation.h>

    NS_ASSUME_NONNULL_BEGIN

    @protocol JJHttpMapper <NSObject>

    @required

    - (void)test_url_login_parameter:(NSDictionary *)parameter

                          body:(NSDictionary*_Nullable)body

                          configBlock:(JJHTTPMapperFailureBlock_Nonnull)configBlock

                          successBlock:(JJHTTPMapperFailureBlock_Nonnull)successBlock

                          failureBlock:(JJHTTPMapperFailureBlock_Nonnull)failureBlock;

    @end

    NS_ASSUME_NONNULL_END

    =======================================

    利用JJHttpMappingManager创建一个遵循JJHttpMapper协议的类.

    =======================================

            id <JJHttpMapper>mapper = [JJHttpMappingManager createMapper_protocol:@protocol(JJHttpMapper)

                                              plistName:@"JJHttpMapper.plist"];

            [mappertest_url_login_parameter:@{} body:@{} configBlock:^(NSError * _Nonnull error) {

            }successBlock:^(NSError*_Nonnullerror) {

            }failureBlock:^(NSError*_Nonnullerror) {

            }];

    =======================================

    以上为使用方法.

    =======================================

    =======================================

    具体实现:

    首先创建一个类

    JJMapperImpl.h

    =======================================

    #import <Foundation/Foundation.h>

    NS_ASSUME_NONNULL_BEGIN

    @interface JJMapperImpl : NSObject

    @property (nonatomic ,strong)NSString *config_path;

    //这个应该将网络请求的manager返回,可配置一些头文件等

    typedefvoid(^JJHTTPMapperConfigBlock)(NSString*_Nonnullmessage);

    typedefvoid(^JJHTTPMapperSuccessBlock)(NSString*_Nonnullmessage,id_NullableresponseObject);

    typedefvoid(^JJHTTPMapperFailureBlock)(NSError*_Nonnullerror);

    - (void)impl_urlSession:(NSString*_Nonnull)method

                      :(NSString*_Nonnull)urlString

                      :(NSDictionary*_Nullable)parameter

                      :(NSDictionary*_Nullable)body

                      :(JJHTTPMapperFailureBlock_Nonnull)configBlock

                      :(JJHTTPMapperFailureBlock_Nonnull)successBlock

                      :(JJHTTPMapperFailureBlock_Nonnull)failureBlock;

    @end

    NS_ASSUME_NONNULL_END

    =======================================

    JJMapperImpl.m

    =======================================

    #import <objc/message.h>

    #import "JJMapperImpl.h"

    @implementation JJMapperImpl

    - (void)impl_urlSession:(NSString*_Nonnull)method

    :(NSString*_Nonnull)urlString

    :(NSDictionary*_Nullable)parameter

    :(NSDictionary * _Nullable )body

    :(JJHTTPMapperFailureBlock _Nonnull )configBlock

    :(JJHTTPMapperFailureBlock _Nonnull )successBlock

                      :(JJHTTPMapperFailureBlock_Nonnull)failureBlock{

    }

    @end

    =======================================

    JJHttpMappingManager.h

    =======================================

    #import  <Foundation/Foundation.h>

    #import "JJMapperImpl.h"

    NS_ASSUME_NONNULL_BEGIN

    @interface JJHttpMappingManager : NSObject

    + (JJMapperImpl*)createMapper_protocol:(Protocol*)protocolplistName:(NSString*)plistName;

    @end

    NS_ASSUME_NONNULL_END

    =======================================

    JJHttpMappingManager.m

    =======================================

    //  Copyright © 2020 jjyangjian. All rights reserved.

    //

    #import "JJHttpMappingManager.h"

    #import <objc/runtime.h>

    #import <objc/message.h>

    #import "JJHttpMapper.h"

    @implementation JJHttpMappingManager

    + (JJMapperImpl*)createMapper_protocol:(Protocol*)protocolplistName:(NSString*)plistName{

       //    Class SubMapperClass = objc_allocateClassPair([JJMapperImpl class], "SubMapperClass", 0);

        //    Protocol *protocol = objc_allocateProtocol((char *)[dict[@"mapperName"] UTF8String]);

            ClassJJMapperImplClass =JJMapperImpl.class;

        //    JJMapperImpl *mapperImpl = JJMapperImpl.new;

            class_addProtocol(JJMapperImplClass, protocol);

        unsignedintmethodCount =0;

        structobjc_method_description*method_description_list =protocol_copyMethodDescriptionList(protocol,true,true, &methodCount);

        for(inti =0; i < methodCount ; i ++){

           structobjc_method_descriptiondescription = method_description_list[i];

           NSLog(@"index:%d name:%@ type:%@",i,NSStringFromSelector(description.name),[NSString stringWithUTF8String:description.types]);

           class_addMethod(JJMapperImplClass, description.name, (IMP)static_urlSession, description.types);

       }

        free(method_description_list);

        JJMapperImpl*mapper = [[JJMapperImplClassalloc]init];

        NSLog(@"%d",[mapperconformsToProtocol:protocol]);

        mapper.config_path= [[NSBundlemainBundle]

                           pathForResource:[NSString stringWithFormat:@"%@",plistName]

                           ofType:nil];

        return mapper;

    }

    static void static_urlSession(id self,

                           SELsel,

                           NSDictionary*_Nullableparameter,

                           NSDictionary*_Nullablebody,

                           JJHTTPMapperFailureBlock_NonnullconfigBlock,

                           JJHTTPMapperFailureBlock_NonnullsuccessBlock,

                           JJHTTPMapperFailureBlock_NonnullfailureBlock)

    {

                               // 获取类中指定名称实例成员变量的信息

                               Ivarivar =class_getInstanceVariable([selfclass],"test");

                           // 获取整个成员变量列表

                           //  Ivar * class_copyIvarList ( Class cls, unsigned intint * outCount );

                           // 获取类中指定名称实例成员变量的信息

                           //  Ivar class_getInstanceVariable ( Class cls, const charchar *name );

                           // 获取类成员变量的信息

                           //  Ivar class_getClassVariable ( Class cls, const charchar *name );

                               // 返回名为test的ivar变量的值

                               idobj =object_getIvar(self, ivar);

                               NSLog(@"%@",obj);

                           //    NSLog(@"mapper_imp:参数:%@",parameter);

                               NSLog(@"ClassName:%@",NSStringFromClass([selfclass]));

        NSString *selName = NSStringFromSelector(sel);

        NSArray *arr = [selName componentsSeparatedByString:@"_"];

        NSMutableString *urlSuffix = NSMutableString.new;

        //接口后缀处理完毕

        for(inti =0; i < arr.count-1; i ++) {

            [urlSuffixappendString:@"/"];

            [urlSuffixappendString:arr[i]];

        }

        NSDictionary *configDictionary =[NSDictionary dictionaryWithContentsOfFile:((JJMapperImpl *)self).config_path];

        NSArray*list = configDictionary[@"list"];

        NSString*method =@"GET";

        for(inti =0; i < list.count; i ++) {

            if([urlSuffixisEqualToString:list[i][@"suffix"]]) {

                method = list[i][@"method"];

            }

        }

        [((JJMapperImpl *)self) impl_urlSession:method

                                               :[NSStringstringWithFormat:@"www.baidu.com%@",urlSuffix]

                                               :parameter

                                               :body

                                               :configBlock

                                               :successBlock

                                               :failureBlock];

    }

    @end

    =======================================

    以上就是小demo

    但事实上,直接利用最简单的方式也能完成,我发现这份代码基本没什么用🙄就当对runtime的一个研究吧

    相关文章

      网友评论

          本文标题:2020-02-19

          本文链接:https://www.haomeiwen.com/subject/dvfzfhtx.html