2011-01-03 7 views
24

ブロックは最終的にiphone/ipad開発用にサポートされていますが、これらはデリゲートの必要性を完全に排除するのですか、デリゲートは完全なインターフェイス実装としてよりクリーンですが、ブロックは単一のタスクにより適していますか?コードブロックは代理人を完全に置き換えますか?

答えて

9

コールバックメソッドの代わりにブロック/クロージャを使用することができますが、これを使用してデリゲートシステムを置き換えることはできません。すべてのデリゲートがほぼオブジェクトの手段であるオブジェクトの通信であり、したがって、可能性は単に任意のコードの実行よりもはるかに豊富です。

このように、「より適切な単一タスク」のコメント(さらには特定の分離されたタスクのみ)に同意する必要があります。

40

私はこれに関する公式のドキュメントを探していますが、まだ見つかっていません。 iOS 5で公開されている新しいクラスと既存のクラスに追加されたクラスをレビューした結果、代理プロトコルを推測する代わりに直接因果関係のあるコールとブロックのパフォーマンス。

したがって、進行中の通信が必要な場合は、代理プロトコルが正しく、通信の原因となるアクションが拡散しているか、アクションが3番目のソースから発生しています。ブロックは、主に非同期アクションとシングルショットクラスに関連付けられています。

EDIT:そう、いくつかの例:(ⅰ)通信する必要があるかもしれないものの広い範囲がありますので

UIScrollViewDelegateは正しくデリゲートプロトコルです。 (ii)いかなる順序でもいつでも伝達される必要があるかもしれない。 (ⅲ)代表者のコントロールを超えて理由で伝達される。

NSURLConnection +sendAsynchronousRequest:queue:completionHandler:は、(i)報告する結果が1つだけであるため、正確に結果を配信するブロックを取る。 (ii)報告者は、発呼者が取った行動の直接の結果として戻ってくる。

+0

もう少し説明してください? – Sandy

+0

だろう任意の例は、私はコミュニケーションに行くに取得していない場合 – Sandy

+8

@Sandy私はブロックは特定のアクションの結果を提供するための良い方法が、より一般的な会話に悪い基礎であることを提唱しています。ブロックを提供することは、「これはあなたが私と話す方法です」と言うリスナーのようなものです。デリゲートプロトコルは、話し手のように「これは私があなたと話す方法です」と言っています。話し手が主に話す時期を決定する場合、話し方を指示する必要があります。リスナーが特定のことを実行して結果を報告しただけでは、「...これと同じように報告する」ということは意味があります。 – Tommy

8

私は他の回答にコメントを残すべきか、自分の答えを残すべきかを決定しようとしていました。私は決めました、そして、ここにあります。

私は主にC#の開発者です。C#は常に動詞を第一級の市民として扱っているため、委任パターン全体をブロックで置き換えることができます。実際、これはJavaとAndroidプラットフォームで作業を始めたときに慣れるのが最も難しいものの1つでした。その経験は私がObjective-CとCocoaを学ぶと簡単になりました。

私はそれが特に強く感じられないオブザーバーパターン対デリゲーションパターンの実装の詳細だと思います。私は継承指向よりかなりかなり構成されているので、C#であっても頻繁に委譲パターンを使用します。

いずれか一方を他方に置き換える必要はありません。私は2つのパターンがそれぞれが最も適切なところで使われるべきだと思う。しかし、私は、ココアの委任パターンよりもオブザーバーパターンを間違いなく好むいくつかのインスタンスを見つけました。

たとえば、UIAlertViewの結果を処理するには、デリゲートではなくブロックを使用する必要があります。それはいつも私には少し奇妙な気がしましたが、APIの特定の部分が開発されたときはブロックが利用できませんでした。その結果、私はアップルがこれが好ましいアプローチであるべきか、それが当時の唯一のアプローチであるべきかどうかは決して確かではありませんでした。

は最近、私は私のゲームの一つにGameKitを統合し、(実際には、私が使用したすべてのもの)の非同期呼び出しのほとんどは、デリゲートを使用していないことがわかりました。彼らはブロックを使用します。私は彼らがUIAlertViewを今日書き直すことができたら、デリゲートの代わりにブロックを使用して、ユーザー入力に続くコールバックを処理すると思います。もちろん、それはただの推測です。

あなたの質問に対する簡単な答え:不必要に複雑な継承階層を避けるためにオブジェクトを作成するときは委任パターンが好きで、コールバックやイベントハンドラのようなイベントに似たものを扱うときはオブザーバパターンが好きです。前者は代理人を、後者はブロックを使用します。

+0

すごく短い答えです。 – poiuytrez

+0

実際、iOS 8では、UIAlertViewはViewControllerによって変更されました。また、UIAlertViewControllerにはブロックを使用するアクションがあります。 – dcorbatta

1

私は、件名に自分の研究をやっていると私は、この記事は非常に有益であることが判明し、ジャスティン・ドリスコールによって書かれた、と私はそれが同様に他の誰かを助けることができると思います。ここで

リンクは次のとおりです。Communicating with Blocks in Objective-C

0

代表団 - あなたはプロセス/イベント/状態を知りたいときは、デリゲートを使用することができます。 NSURLConnectionDelegateでたとえばあなたが二つ以上のデリゲートメソッドを持つデータのステータスを取得します.didReceive:NSDataのconnectionDidFinishLoading

ブロック - あなたは結果やエラーを期待するときだけブロックを使用することができます

ベスト参照 - http://blog.stablekernel.com/blocks-or-delegates/

great.Thanks
関連する問題