MUBlockDelegate——一个基于Block的通用委托实现

1.通常我们这样用委托(Delegate):
//	声明一个委托协议   
    @protocol TestProtcol <NSObject>

    - (NSString*) testDelegateMethod:(NSString*) aString;

    @end

    //实现一个委托协议
    @interface TestDelegateImpl : NSObject<TestProtcol>

    @end

    @implementation TestDelegateImpl

    - (NSString*) testDelegateMethod:(NSString *)aString
    {
        return aString;
    }

    @end

    然后新建一个使用委托的测试类
    #import "TestProtcol.h"

    //需要委托的测试类,例如tableview、scrollview等
    @interface TestObject : NSObject
    
    //维护一个委托对象
    @property(nonatomic, weak) id<TestProtcol> delegate;

    - (NSString*) callDelegate:(NSString*) aString;

    @end
    
    @implementation TestObject

    @synthesize delegate = _delegate;

    //调用委托方法获取返回结果
    - (NSString*) callDelegate:(NSString*) aString
    {
        if ([_delegate respondsToSelector:@selector(testDelegateMethod:)]) {
            return [_delegate testDelegateMethod:aString];
        }
        
        return nil;
    }

    @end
    以上就是一般委托模式的实现,下面来做一下测试:
    
    TestDelegateImpl* testDelegate = [[TestDelegateImpl alloc] init];
    TestObject* testObject = [[TestObject alloc] init];
    testObject.delegate = testDelegate;
    
    //测试委托类是否能正常返回结果
    NSLog(@"result:%@", [testObject callDelegate:@"testNormal"]);

2.但是,如果你使用了MUBlockDelegate...
    不需要写委托协议,也不需要新建委托实现,你只需要新建一个BlockDelegate
    
    //anInvocation用来处理返回结果,调用参数按照顺序放置在NSArray里面。
    MUBlockDelegate* testDelegate = [MUBlockDelegate delegateForSelectorString:@"(@)testDelegateMethod(@)" delegateBlock:^(NSInvocation *anInvocation, NSArray *params) {
        
        //这里便是委托方法的实现。
        //简单地把第一个参数拿出来,返回。
        NSString* testString = [params objectAtIndex:0];
        [anInvocation setReturnValue:&testString];
    }];

    做一些测试:
    
    TestObject* testObject = [[TestObject alloc] init];
    testObject.delegate = (id<TestProtcol>)testDelegate;
    
    NSString* testResult = [testObject callDelegate:@"testBlock"];
    NSLog(@"testResult:%@", testResult);

    程序正常输出:testBlock
    
    另外,你还可以用过Class和Protocol来获得配置好的blockDelegate实例:
    MUBlockDelegate* testDelegate = [MUBlockDelegate delegateForClass:[TestDelegateImpl class] selector:@selector(testDelegateMethod:) delegateBlock:^(NSInvocation *anInvocation, NSArray *params) {
        
        NSString* testString = [params objectAtIndex:0];
        [anInvocation setReturnValue:&testString];
    }];
    
    MUBlockDelegate* testDelegate = [MUBlockDelegate delegateForProtocol:@protocol(TestProtcol) selector:@selector(testDelegateMethod:) delegateBlock:^void(NSInvocation* anInvocation, NSArray *params) {
        
        NSString* testString = [params objectAtIndex:0];
        [anInvocation setReturnValue:&testString];
    }];

3.源码下载:
下载地址:    GitHub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值