如何将基于委托的回调系统转换为基于块的回调系统



我有一个类,它有一个基于委托的系统,用于发送不同类型的请求。它使用委托来告诉对象请求何时完成,以及请求是成功还是错误。

现在,我还必须检查响应的请求类型,以便采取适当的操作。

我有一个包装类,它应该给我一个基于块的接口。

我将一个完成块和一个错误块传递给一个请求方法,该方法应该在内部使用这个基于委托的类。

当响应到来时,应该根据成功和错误自动调用该请求类型的适当处理程序。

我在SO上看到一个类似的问题,但我有点不清楚,所以请给一个大概的想法,如何去做,而不是直接标记为重复

这是一种方法。使用这个RAExpendable类来动态地构建一个基于块的实现委托。

假设你的委托是:

@protocol XDelegate
-(void) foo:(id)response;
@end

添加RAExpendable.h, RAExpendable。我从https://github.com/evadne/RAExpendable到你的项目。动态添加委托方法:

    RAExpendable *expendable = [RAExpendable new];
    [expendable addMethodForSelector:@selector(foo:) types:"v@:@" block:^(id x, SEL sel, id response){
        NSLog(@"response is %@", response);
    }];

并将expendable类设置为您的委托:

    someObject.delegate = expendable;

现在,如果你这样做:

    [expendable performSelector:@selector(foo:) withObject:@"OK"];

得到字符串response is OK。用你认为合适的成功/失败实现替换NSLog。从现在开始,当您调用foo:时,将执行该块。

如果您想为您的用例修改它,请注意此示例的参数是v@:@,根据运行时的类型编码指南,它意味着:void return, self, SEL, object。selfSEL是存在于每个Objective-C方法中的两个隐藏参数,第三个参数是方法的第一个非隐藏参数。块的签名必须与方法的签名匹配

使用REKit,你可以像下面这样动态地创建一个委托:

id dynamicDelegate;
dynamicDelegate = [[NSObject alloc] init];
[dynamicDelegate respondsToSelector:@selector(foo:) withKey:nil usingBlock:^(id receiver, id response) {
    NSLog(@"response is %@", response);
}];
someObject.delegate = dynamicDelegate;

最新更新