面试宝点pod & git

iOS组件化Router简单实现

2018-07-09  本文已影响0人  春雨霏霏_____

Github地址:https://github.com/AndrewXF/XFRouter


// 组件对外公开接口, m组件名, i接口名, p(arg)接收参数, c(callback)回调block

#define XFROUTER_EXTERN_METHOD(m,i,p,c) + (id) routerHandle_##m##_##i:(NSDictionary*)arg callback:(id)callback

@interfaceXFRouter :NSObject

+(void)openURL:(NSString*)stringUrl arg:(NSDictionary*)param error:(NSError*)error callBack:(void(^)(void))callBack;

@end

#import "XFRouter.h"

#import

#import

@implementation XFRouter

#pragma mark - public methods

+ (instancetype)sharedInstance

{

    staticXFRouter*mediator;

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        mediator = [[XFRouteralloc]init];

    });

    returnmediator;

}

+(void)openURL:(NSString*)stringUrl arg:(NSDictionary*)param error:(NSError*)error callBack:(void(^)(void))callBack

{

    if(![stringUrlcontainsString:@"router://"]) {

        NSLog(@"不合法的router");

        return;

    }

    NSString*moduleStr =nil;

    NSString*actionStr =nil;

    if(!param) {

        NSMutableDictionary *params = [[NSMutableDictionary alloc] init];

        NSArray*urlElementsArrary = [stringUrlcomponentsSeparatedByString:@"//"];

        NSString*pathStr = [urlElementsArrarylastObject];

        if([stringUrlcontainsString:@"?"]) {

            NSArray*paramsArrary = [stringUrlcomponentsSeparatedByString:@"?"];

            NSString*paramsStr = [paramsArrarylastObject];

            for(NSString*paramStrin[paramsStrcomponentsSeparatedByString:@"&"]) {

                NSArray*elts = [paramStrcomponentsSeparatedByString:@"="];

                if([eltscount] <2)continue;

                [paramssetObject:[eltslastObject]forKey:[eltsfirstObject]];

            }

            NSArray*pathStrArrary = [pathStrcomponentsSeparatedByString:@"?"];

            pathStr = [pathStrArraryfirstObject];

        }

        param = params;

        NSArray*pathElementsArrary = [pathStrcomponentsSeparatedByString:@"/"];

        moduleStr = [pathElementsArraryfirstObject];

        actionStr = [pathElementsArrarylastObject];

    }else

    {

        if([stringUrlcontainsString:@"?"]) {

            NSLog(@"不合法的router");

            return;

        }

        NSArray*urlElementsArrary = [stringUrlcomponentsSeparatedByString:@"//"];

        NSString*pathStr = [urlElementsArrarylastObject];

        NSArray*pathElementsArrary = [pathStrcomponentsSeparatedByString:@"/"];

        moduleStr = [pathElementsArraryfirstObject];

        actionStr = [pathElementsArrarylastObject];

    }

    NSString*routerStr = [NSStringstringWithFormat:@"routerHandle_%@_%@:callback:",moduleStr,actionStr];

    ClasstargetClass =NSClassFromString(moduleStr);

    SELaction =NSSelectorFromString(routerStr);

    ((void(*)(id,SEL,id,id))objc_msgSend)(targetClass, action,param,callBack);

    if(callBack) {

        callBack();

    }

}

@end


组件代码使用代码

#import

@interfaceTestModule :NSObject

@end

#import "TestModule.h"

#import "TestModuleViewController.h"

#import "TestModuleViewController1.h"

#import "XFRouter.h"

#import "XFNavigationTool.h"

@implementation TestModule

XFROUTER_EXTERN_METHOD(TestModule, gotoView1, arg, callback) {

    NSLog(@"gotoView1 get arg=%@",arg);

    TestModuleViewController *view = [[TestModuleViewController alloc] init];

    [[XFNavigationTool currentNavigationVC] pushViewController:view animated:YES];

    return nil;

}

XFROUTER_EXTERN_METHOD(TestModule, gotoView2, arg, callback) {

    NSLog(@"gotoView2 get arg=%@",arg);

    TestModuleViewController1 *view = [[TestModuleViewController1 alloc] init];

    [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:view animated:YES completion:nil];

    return nil;

}

@end



上一篇 下一篇

猜你喜欢

热点阅读