首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将基于委托的回调系统转换为基于块的回调系统?

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

Stack Overflow用户
提问于 2013-01-04 19:01:30
回答 2查看 1.7K关注 0票数 6

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

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

我有一个包装器类,它应该为我提供一个基于块的接口。

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

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

我在SO上看到了一个类似的问题,但对我来说有点不清楚,所以请给出一个大概的想法,而不是直接将其标记为重复的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-04 19:58:31

这里有一种方法可以做到。使用此RAExpendable类动态生成基于块的实现的委托。

假设您的代理是:

代码语言:javascript
复制
@protocol XDelegate
-(void) foo:(id)response;
@end

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

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

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

代码语言:javascript
复制
    someObject.delegate = expendable;

现在,如果你这样做:

代码语言:javascript
复制
    [expendable performSelector:@selector(foo:) withObject:@"OK"];

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-14 19:40:23

使用REKit,您可以动态创建一个委托,如下所示:

代码语言:javascript
复制
id dynamicDelegate;
dynamicDelegate = [[NSObject alloc] init];
[dynamicDelegate respondsToSelector:@selector(foo:) withKey:nil usingBlock:^(id receiver, id response) {
    NSLog(@"response is %@", response);
}];
someObject.delegate = dynamicDelegate;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14155878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档