ブロックは最終的にiphone/ipad開発用にサポートされていますが、これらはデリゲートの必要性を完全に排除するのですか、デリゲートは完全なインターフェイス実装としてよりクリーンですが、ブロックは単一のタスクにより適していますか?コードブロックは代理人を完全に置き換えますか?
答えて
コールバックメソッドの代わりにブロック/クロージャを使用することができますが、これを使用してデリゲートシステムを置き換えることはできません。すべてのデリゲートがほぼオブジェクトの手段であるオブジェクトの通信であり、したがって、可能性は単に任意のコードの実行よりもはるかに豊富です。
このように、「より適切な単一タスク」のコメント(さらには特定の分離されたタスクのみ)に同意する必要があります。
私はこれに関する公式のドキュメントを探していますが、まだ見つかっていません。 iOS 5で公開されている新しいクラスと既存のクラスに追加されたクラスをレビューした結果、代理プロトコルを推測する代わりに直接因果関係のあるコールとブロックのパフォーマンス。
したがって、進行中の通信が必要な場合は、代理プロトコルが正しく、通信の原因となるアクションが拡散しているか、アクションが3番目のソースから発生しています。ブロックは、主に非同期アクションとシングルショットクラスに関連付けられています。
EDIT:そう、いくつかの例:(ⅰ)通信する必要があるかもしれないものの広い範囲がありますので
UIScrollViewDelegate
は正しくデリゲートプロトコルです。 (ii)いかなる順序でもいつでも伝達される必要があるかもしれない。 (ⅲ)代表者のコントロールを超えて理由で伝達される。
NSURLConnection +sendAsynchronousRequest:queue:completionHandler:
は、(i)報告する結果が1つだけであるため、正確に結果を配信するブロックを取る。 (ii)報告者は、発呼者が取った行動の直接の結果として戻ってくる。
私は他の回答にコメントを残すべきか、自分の答えを残すべきかを決定しようとしていました。私は決めました、そして、ここにあります。
私は主にC#の開発者です。C#は常に動詞を第一級の市民として扱っているため、委任パターン全体をブロックで置き換えることができます。実際、これはJavaとAndroidプラットフォームで作業を始めたときに慣れるのが最も難しいものの1つでした。その経験は私がObjective-CとCocoaを学ぶと簡単になりました。
私はそれが特に強く感じられないオブザーバーパターン対デリゲーションパターンの実装の詳細だと思います。私は継承指向よりかなりかなり構成されているので、C#であっても頻繁に委譲パターンを使用します。
いずれか一方を他方に置き換える必要はありません。私は2つのパターンがそれぞれが最も適切なところで使われるべきだと思う。しかし、私は、ココアの委任パターンよりもオブザーバーパターンを間違いなく好むいくつかのインスタンスを見つけました。
たとえば、UIAlertViewの結果を処理するには、デリゲートではなくブロックを使用する必要があります。それはいつも私には少し奇妙な気がしましたが、APIの特定の部分が開発されたときはブロックが利用できませんでした。その結果、私はアップルがこれが好ましいアプローチであるべきか、それが当時の唯一のアプローチであるべきかどうかは決して確かではありませんでした。
は最近、私は私のゲームの一つにGameKitを統合し、(実際には、私が使用したすべてのもの)の非同期呼び出しのほとんどは、デリゲートを使用していないことがわかりました。彼らはブロックを使用します。私は彼らがUIAlertViewを今日書き直すことができたら、デリゲートの代わりにブロックを使用して、ユーザー入力に続くコールバックを処理すると思います。もちろん、それはただの推測です。
あなたの質問に対する簡単な答え:不必要に複雑な継承階層を避けるためにオブジェクトを作成するときは委任パターンが好きで、コールバックやイベントハンドラのようなイベントに似たものを扱うときはオブザーバパターンが好きです。前者は代理人を、後者はブロックを使用します。
私は、件名に自分の研究をやっていると私は、この記事は非常に有益であることが判明し、ジャスティン・ドリスコールによって書かれた、と私はそれが同様に他の誰かを助けることができると思います。ここで
リンクは次のとおりです。Communicating with Blocks in Objective-C
代表団 - あなたはプロセス/イベント/状態を知りたいときは、デリゲートを使用することができます。 NSURLConnectionDelegateでたとえばあなたが二つ以上のデリゲートメソッドを持つデータのステータスを取得します.didReceive:NSDataのconnectionDidFinishLoading
ブロック - あなたは結果やエラーを期待するときだけブロックを使用することができます
great.Thanks- 1. フォークを起点(github)で完全に置き換えます
- 2. `npm`を` yarn`に完全に置き換えても安全ですか?
- 3. タイプリストは完全に可変的なテンプレートに置き換えられますか?
- 4. 個人リポジトリ用の既存のマスターを完全に新しいファイルセットに置き換えます。
- 5. ウィンドウ7のログオン画面を完全に置き換えますか?
- 6. http.CloseNotifyはhttp.Request.Context()で完全に置き換えられましたか?Done()?
- 7. gitリポジトリのコードを完全に置き換える方法
- 8. iOSコアデータモデルを完全に置き換える
- 9. 代理人を別の代理人に変換します。擬似キャスト
- 10. ASMによる完全なメソッドの置き換え
- 11. 完全なGoogleスプレッドシートのテキストを置き換える方法
- 12. Ajax:divコンテンツを新しいデータで完全に置き換えます
- 13. 代理文を目的のC言語に置き換える
- 14. 'cond'は 'if'文を完全に置き換えることはできますか?
- 15. VBAをGroovyのScriptomに完全に置き換えることはできますか?
- 16. Sedは交換線全体を置き換えます
- 17. 代理人または代理人またはその他
- 18. Spark SQLはApache ImpalaまたはApache Hiveを完全に置き換えますか?
- 19. ag-grid FullWidthCellRendererが完全な行を置き換えています
- 20. コントローラーはhttpハンドラーの機能を完全に置き換えることができますか?
- 21. 例外は完全にif elseに置き換えることができますか?
- 22. MongoDB:ドキュメントを完全に置き換えながら更新する
- 23. カスタムビルドのセキュリティテストのシナリオを完全に置き換えるためにsonarQubeを使用できますか?
- 24. PHP str_replace() - スペースの代わりに置き換えますか?
- 25. Sitecore helix Apply-Xml-Transformは、変換する代わりにweb.config全体を置き換えます
- 26. 完全なjavascript関数と一致して置き換えます
- 27. "完全な単語のみ"オプションで検索して置き換えます
- 28. 完全にユーザー名を電子メールに置き換えてください。Django
- 29. アップルのApp Storeに提出されたアプリを完全に置き換える
- 30. パンダ:辞書から完全一致文字列を置き換え
もう少し説明してください? – Sandy
だろう任意の例は、私はコミュニケーションに行くに取得していない場合 – Sandy
@Sandy私はブロックは特定のアクションの結果を提供するための良い方法が、より一般的な会話に悪い基礎であることを提唱しています。ブロックを提供することは、「これはあなたが私と話す方法です」と言うリスナーのようなものです。デリゲートプロトコルは、話し手のように「これは私があなたと話す方法です」と言っています。話し手が主に話す時期を決定する場合、話し方を指示する必要があります。リスナーが特定のことを実行して結果を報告しただけでは、「...これと同じように報告する」ということは意味があります。 – Tommy