【问题标题】:How to convert a delegate-based callback system into block-based?如何将基于委托的回调系统转换为基于块的回调系统?
【发布时间】:2012-12-18 19:36:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: objective-c delegates objective-c-blocks


    【解决方案1】:

    这是一种方法。使用这个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@:@,根据运行时的Type Encoding 指南,这意味着:void return、self、SEL、object。 selfSEL 是每个 Objective-C 方法中存在的两个隐藏参数,第三个参数是方法的第一个非隐藏参数。块的签名必须与方法的签名匹配。

    【讨论】:

    • 有多个参数的例子吗?此外,我在将 RAExpendable 分配为代表时收到此消息:Assigning to 'id<VLCMediaThumbnailerDelegate>' from incompatible type 'RAExpendable *__strong'
    【解决方案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;
    

    【讨论】:

    • 为我工作。而且我很感激不必自己弄清楚 Objective-C 类型!
    • P.S. @Kazki,您忘记添加“作者免责声明”。 ;)
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 2011-06-28
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多