我有两节课。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
探索的解决方案:
包装
Delegator
成一个新的类或类别并创建一个返回块的方法,如this answer中所建议的那样。这些解决方案有效,但过于复杂和耗时。Blocker
符合协议Delegate
并将块保存在属性中,在方法中实例化它,methodWithBlock
并在调用委托方法时调用块。这不起作用,因为没有指向这个新实例的强指针并且它被破坏了。在之前的解决方案中,为避免因缺少强指针而丢失实例,保留当前实例的静态数组
Blocker
并在委托回调方法中删除它们。同样,此解决方案有效,但过于复杂。