gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:44:34 24 4
gpt4 key购买 nike

我有一个类,它有一个基于委托(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com