6

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

现在,我还必须检查它是什么类型的请求以响应采取适当的措施。

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

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

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

我在 SO 上看到了一个类似的问题,但对我来说有点不清楚,所以请大致了解如何去做,而不是立即将其标记为重复。

4

2 回答 2

2

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

假设您的代表是:

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

将来自https://github.com/evadne/RAExpendable的RAExpendable.h、RAExpendable.m 添加到您的项目中。动态添加委托方法:

    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。self并且SEL是每个 Objective-C 方法中存在的两个隐藏参数,第三个参数是该方法的第一个非隐藏参数。块的签名必须与方法的签名匹配。

于 2013-01-04T11:58:31.340 回答
2

使用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;
于 2013-02-14T11:40:22.650 回答