Delegateを使うのかBlocksを使うのか

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,553

yoneapp

score 87

こんにちは。Delegateを使うのかBlocksを使うのかで悩んでいます。例えばTableViewはDelegateで実装されてるのは、確かにソッチのほうが読みやすい気はします。簡単な処理はBlocksでやればいい気もします。

その中間ぐらいの、ひとつのオブジェクトに対してsuccessHandlerのようなBlocksが3〜4本生えてしまう場合はどちらを使えばいいかの判断が難しいなと思いました。

みんさんは、どういった使い分けをされていますか?


ご質問の件の追記になります。ご返答大変遅くなり申し訳ございません。
本件は、漠然とした悩みでもありますが、実際には通信を行った場合の処理で悩んでおりました。

最初は以下の状態でした。
・成功
・その他の失敗

そこに、いくつかの要件が加わり、以下の機能が必要になりました。

・成功
・403で失敗
・その他の失敗
・進展状況

今回はコールバックを増やすことで対応してみました。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/08/16 23:25

    完全にケース・バイ・ケースの話だと思います。具体的にどんなケースですか?

    キャンセル

  • Stripe

    2015/08/29 17:40

    あなたが今作っているのは、一般ユーザ向けのアプリケーションですか?それとも開発者向けのフレームワークやライブラリですか?

    キャンセル

  • yoneapp

    2015/08/29 17:47

    一般ユーザ向けのアプリケーションになります。

    キャンセル

回答 2

checkベストアンサー

+4

僕の場合の話ですが、Blocksはある1つの関数呼び出しで行われる一連の処理が終われば解放されるような処理に使用しています。必ず能動的に終わる事が分かっていれば呼び出しが別のスレッドタイミングであってもOKです。わかりやすいのが[UIView animateWith...]のような関数の一部の処理を呼び出し側に任せたり完了コールバックを持たせたりする場合です。

例に挙げられているオブジェクトがコールバック的なものを持っている場合はそれが1つであろうとDelegateにしています。
オブジェクトのプロパティなどでBlocksを保持すると循環参照になりやすく、回避する責任をBlocksを実装する側に持たせてしまいます。Delegateの場合はDelegateを保持するオブジェクトがweakで保持してやればいいので気にする場所が局所的になります。以前オブジェクトのコールバックをBlocksにしたため循環参照になって残ってしまい、あるタイミングで1つしか存在しないはずのオブジェクトが複数存在してしばらく悩んだことがあったのでそれ以降こうやっています。

といいながらも、NSTimerがBlocks対応してたら楽なのにな、とか思ったりもするのですが……

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

一般ユーザ向けにアプリケーションを開発しているという状況なら、そもそもコールバックという仕組みを実装する必要はありません。
なぜなら、コールバック元のコードもコールバック先のコードも自分で書くからです。
さらに、コールバックする項目についても、アプリケーションの仕様により前もって決定してしまいます。

そもそもコールバックという仕組みを実装するのは、フレームワークやライブラリを提供する場合で、その使用者がコールバック先にどのようなコードを書くのかが不明だからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる