YH_ModuleService.m 2.92 KB
//
//  YH_ModuleService.m
//  YH_WatchDog
//
//  Created by redding on 16/3/7.
//  Copyright © 2016年 YOHO. All rights reserved.
//

#import "YH_ModuleService.h"
#import "YH_WatchDog.h"

@implementation YH_ModuleService
{
    Class _moduleClass;
    NSInvocation *_invocation;
    NSString *_methodSignature;
    SEL _selector;
}

@synthesize serviceName = _serviceName;

- (instancetype)initWithServiceName:(NSString *)serviceName methodSignature:(NSString *)objCMethodName moduleClass:(__unsafe_unretained Class)moduleClass callbackSignal:(UBSignal *)signal queue:(NSOperationQueue *)queue
{
    if ((self = [super init])) {
        _serviceName = [serviceName copy];
        _moduleClass = moduleClass;
        _methodSignature = [objCMethodName copy];
        _signal = signal;
        _queue = queue;
    }
    
    return self;
}

- (instancetype)initWithServiceName:(NSString *)serviceName methodSignature:(NSString *)objCMethodName moduleClass:(Class)moduleClass
{
    self = [self initWithServiceName:serviceName methodSignature:objCMethodName moduleClass:moduleClass callbackSignal:nil queue:nil];
    if (self) {
        
    }
    
    return self;
}

- (void)processMethodSignature
{
    // module的service方法的名称格式:serviceName:(NSDictionary *)parameters
    // 生成selector需要的是:serviceName:
    NSRange range = [_methodSignature rangeOfString:@":"];
    NSString *selectorString = [_methodSignature substringToIndex:range.location + 1];
    _selector = NSSelectorFromString(selectorString);
    NSMethodSignature *methodSignature = [_moduleClass instanceMethodSignatureForSelector:_selector];
    NSAssert(methodSignature, @"%@ is not a recognized Objective-C method.", _methodSignature);
    
    // Create method invocation
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
    invocation.selector = _selector;
    _invocation = invocation;
}

- (SEL)selector
{
    if (_selector == NULL) {
        [self processMethodSignature];
    }
    return _selector;
}

- (void)invokeWithBridge:(YH_WatchDog *)bridge
                  module:(id)module
               arguments:(NSArray *)arguments
{
    if (!_invocation) {
        [self processMethodSignature];
    }
    
    // Set arguments
    NSDictionary *input = [arguments firstObject];
    [_invocation setArgument:&input atIndex:2];
    [_invocation retainArguments];
    // Invoke method
    [_invocation invokeWithTarget:module];
}

- (NSString *)serviceName
{
    if (_selector == NULL) {
        [self processMethodSignature];
    }
    return [NSString stringWithFormat:@"-[%@ %@]", _moduleClass, NSStringFromSelector(_selector)];
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p; exports %@;>", [self class], self, [self serviceName]];
}

- (NSString *)debugDescription
{
    return [NSString stringWithFormat:@"\n  serviceId %@: %p, \n  methodSignature: %@", [self serviceName], self, _methodSignature];
}


@end