objective-c - 如何将基于委托(delegate)的回调系统转换为基于 block 的?

标签 objective-c delegates objective-c-blocks

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

现在,我还必须检查请求的类型,以便采取适当的措施。

我有一个包装类,它应该为我提供一个基于 block 的接口(interface)。

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

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

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

最佳答案

这是一种方法。使用这个 RAExpendable类以使用基于 block 的实现动态构建委托(delegate)。

假设您的委托(delegate)是:

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

https://github.com/evadne/RAExpendable 添加 RAExpendable.h、RAExpendable.m到你的项目。动态添加委托(delegate)方法:

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

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

    someObject.delegate = expendable;

现在,如果你这样做:

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

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

如果您想针对您的用例修改它,请注意此示例的参数是 v@:@,根据 Type Encoding运行时的引导意味着:void return、self、SEL、object。 selfSEL 是每个 Objective-C 方法中存在的两个隐藏参数,第三个参数是方法的第一个非隐藏参数。 block 的签名必须与方法的签名相匹配。

关于objective-c - 如何将基于委托(delegate)的回调系统转换为基于 block 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155878/

相关文章:

objective-c - 二元运算符 '+=' 不能应用于类型 'Int' 和 'UInt8' 的操作数

ios - Objective-c 多播委托(delegate)

cocoa - 使用核心动画的 NSView 显式动画

c# - delegate 关键字与 lambda 表示法

objective-c - 我可以在具有自己的回调 block 的方法中释放 Controller 吗?

ios - 在 SpriteKit 中重置场景

.net - 在 .NET 框架中引发事件的正确方法

objective-c - 如何在 NSUserDefaults 中存储带有 block 变量的自定义对象

iphone - 从 NSArray 执行 block ?

ios - 调整 webView 大小时如何修复 webView 的粗糙滚动行为?