我有一个类,它有一个基于委托(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。 self
和 SEL
是每个 Objective-C 方法中存在的两个隐藏参数,第三个参数是方法的第一个非隐藏参数。 block 的签名必须与方法的签名相匹配。
关于objective-c - 如何将基于委托(delegate)的回调系统转换为基于 block 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155878/