私には2つのクラスがあります。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
して、ブロックを返すメソッドを作成します。これらのソリューションは機能しますが、非常に複雑で時間がかかります。プロトコルに
Blocker
準拠しDelegate
、ブロックをプロパティに保持し、メソッド内でインスタンス化しmethodWithBlock
、委任メソッドが呼び出されたときにブロックを呼び出します。この新しいインスタンスへの強力なポインタがなく、破棄されるため、これは機能しません。前のソリューションでは、強力なポインターがないためにインスタンスが失われるのを防ぐために、の現在のインスタンスの静的配列を保持
Blocker
し、デリゲートコールバックメソッドでそれらを削除します。繰り返しますが、このソリューションは機能しますが、複雑すぎます。