gpt4 book ai didi

iOS/objective-C : How can I mix delegation and blocks?

转载 作者:行者123 更新时间:2023-12-01 16:52:19 24 4
gpt4 key购买 nike

我有两个类。 Delegator使用委托(delegate)发送其结果。 Blocker在静态方法中使用 block 。

不变Delegator ,我怎么能优雅轻松实现methodWithBlock以便使用 methodWithDelegate 生成的结果调用 block ?

委托(delegate)人:

@class Delegator;

@protocol Delegate <NSObject>
- (void)delegator:(Delegator *)sender producedResult:(int)result;
@end

@interface Delegator : NSObject
@property (weak, nonatomic) id <Delegate> delegate;
- (void)methodWithDelegate;
@end

@implementation Delegator
- (void)methodWithDelegate
{
// Some asynchronous computation resulting in
[self.delegate delegator:self producedResult:42];
}
@end

拦截器:
@interface Blocker : NSObject
+ (void)methodWithBlock:(void(^)(int result))block;
@end

@implementation Blocker
+ (void)methodWithBlock:(void(^)(int result))block
{
// How to call Delegator's methodWithDelegate and return
// the result using block ?
...
}
@end

探索的解决方案:
  • 包裹 Delegator进入一个新的类或类别并创建一个返回 block 的方法,如 this answer 中所建议的那样.这些解决方案有效,但过于复杂和耗时。
  • 制作 Blocker符合协议(protocol)Delegate并将 block 保存在属性中,在方法 methodWithBlock 中实例化它,并在调用委托(delegate)方法时调用该 block 。这不起作用,因为没有指向这个新实例的强指针并且它被破坏了。
  • 在前面的解决方案中,为避免因缺少强指针而丢失实例,保留 Blocker 的当前实例的静态数组并在委托(delegate)回调方法中删除它们。同样,此解决方案有效,但过于复杂。
  • 最佳答案

    使用可观察属性来传达结果,而不是委托(delegate)和 block 属性。它更干净(也更容易),因为工作对象不必担心它的小脑袋可能会是谁在看它。并且观察对象不必担心符合任何特殊协议(protocol)。

    关于iOS/objective-C : How can I mix delegation and blocks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608796/

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