【发布时间】:2013-01-30 16:24:50
【问题描述】:
我有两节课。 Delegator 使用委托来发送其结果。 Blocker 在静态方法中使用块。
在不更改Delegator 的情况下,我如何优雅轻松地 实现methodWithBlock 以便以methodWithDelegate 生成的结果调用块?
委托人:
@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
探索的解决方案:
按照this answer 中的建议,将
Delegator包装到新类或类别中并创建返回块的方法。这些解决方案有效,但过于复杂和耗时。使
Blocker符合协议Delegate并将块保存在属性中,在方法@987654332@中实例化它,并在调用委托方法时调用块。这不起作用,因为没有指向这个新实例的强指针并且它被销毁了。在之前的解决方案中,为避免因缺少强指针而丢失实例,保留
Blocker的当前实例的静态数组,并在委托回调方法中删除它们。同样,此解决方案有效,但过于复杂。
【问题讨论】:
-
我不确定在这种情况下您能否避免并发症。我会选择 3 号,如果实施得当,它应该是赢家。不要害怕复杂的事情:)
-
不清楚您从
-methodWithDelegate返回的结果是什么,因为示例代码中的所有内容都返回void。 -
我不完全确定我是否理解了这个问题,但我很确定如果我理解了我可以帮助你。 Blocker 使用静态函数计算事物,然后通过块发送结果。您可以这样调用这些函数:[Blocker methodWithBlock:^(int result) { ... do anything with result ... }];,这似乎是什么问题?你失去了什么参考?
-
@Ismael:我正在尝试实现 methodWithBlock 方法。
标签: ios objective-c delegates objective-c-blocks