作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个类。 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/
我是一名优秀的程序员,十分优秀!