2

私には2つのクラスがあります。Delegator委任を使用して結果を送信します。Blocker静的メソッドでブロックを使用します。

変更せずに、ブロックが呼び出されて結果が生成されるように、エレガントかつ簡単に実装するDelegatorにはどうすればよいですか?methodWithBlockmethodWithDelegate

委任者:

@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し、デリゲートコールバックメソッドでそれらを削除します。繰り返しますが、このソリューションは機能しますが、複雑すぎます。

4

2 に答える 2

0

デリゲートやブロック プロパティではなく、観察可能なプロパティを使用して結果を伝えます。作業オブジェクトは、誰がそれを見ているのかについて頭を悩ませる必要がないため、よりクリーン (かつ簡単) です。また、監視対象のオブジェクトは、特別なプロトコルへの準拠について心配する必要はありません。

于 2013-01-30T16:31:49.913 に答える
0

エレガントで簡単な解決策は、ブロックベースのメソッドをDelegator(たとえば、カテゴリを介して) 追加することです。それができないと言ったのは知っていますが、新しいクラスを作成して必要な効果を生み出す他のブロックベースのソリューションは、エレガンステストに失敗することを認めなければなりません。

そうは言っても、どうしてもブロックベースのメソッドが必要で、 を拡張できない場合はDelegator、オプション 2 に傾倒しますが、これらのクラス メソッドを作成するのではなく、インスタンス メソッドを作成し、ラッパー メソッドをBlockerインスタンス化Delegatorして定義することで、クラスがhave usedは を使用DelegatorできるようになりBlockerましたが、completionデリゲート コールバックではなくブロックを使用します。また、以前インスタンス化していたクラスは、代わりにインスタンス化Delegatorできるようになりました。Blocker

于 2013-01-30T16:50:58.987 に答える