2011-10-20 5 views
1

最近、プログラミングにおけるブロックの重要性を理解しようとしています(特にObjective-C)。彼らは明らかにiOS/Cocoa APIでかなり使われているので、私はそれらを理解しようとしています。Objective-Cのブロックの有用性を説明してください

ほとんどの場合、ブロックを使用する理由と分離したヘルパー機能を作成するだけの理由については、ほとんど理解できません。たとえば、ソート関数を実装するブロックを作成した場合、その関数をヘルパークラスのメソッドとして作成して、コード内のすべてのオブジェクトがより簡単に使用できるようにするのは簡単でしょうか?

+3

ソート機能が他の場所で使用されていない一回限りのものであればどうでしょうか?ブロックを使用することで、コードの表面積を最小限に抑え、コードの局所性を高めることができます。 –

答えて

2

ブロックは、コールバックや代表者に素敵な代替ありあなたのビジネスロジックは、呼び出しコードのローカルです。

しかし、これらは非常に多くの機能を備えています。非同期性に非常に役立ちます。また、パフォーマンスを向上させるためにGCDを使用する必要がある場合は必要です。

Appleの公式ドキュメント以外にも、私は非常に良いPractical BlocksをMike Ashさんが読むことをお勧めします。

+0

「ビジネスロジックを呼び出しコードにローカルに保つ」という考え方は、私が立ち上がっているところです。ビジネスロジックを再利用する必要がある場合はどうすればよいですか?それはコードに再利用可能性を近づけないようにしていますか? – chrismanderson

+2

ブロックは、リユーザブルコードをパブリックまたはプライベートヘルパーにリファクタリングすることを止めませんが、コードの簡潔性を高め、補完的な方法で再利用するのに役立ちます。 'myNewHelperMethod:(id)obj'への非同期操作を含む再利用可能なコードをリファクタリングします。今度はヘルパーが完了した後にあなたの呼び出しオブジェクトが何かをすることを望んでいるとしましょう。あなたは委任またはNSNotificationsを使うことができますが、どちらもコントロールの流れにはかなり重いです。代わりに、あなたはヘルパーに呼び出し側からブロックを受け取らせることができます: 'mynewHelperMethod:(id)obj withCompletionBlock:^(id obj)aBlock' – followben

2

ブロックの優れた機能は、オブジェクトを使用できる場所であればどこでも使用できるということです。ブロックを配列または辞書に格納する。もう一つの興味深いところは、メソッドの引数、例えばなどのオブジェクト内またはオブジェクト間のブロックを渡すことができるということです。:

- (void)processDataWithBlock:(void (^)(void))block 
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations 

第二の方法はさらにUIView APIです。関数ポインタはここではできると主張するかもしれませんが、それはより複雑で、柔軟性が低く、非干渉性になります。また、ブロックは引数として渡さずにローカル変数とインスタンス変数にアクセスできます。保つことによって、コードの可読性を向上させることよりも何もないため場合

ビューのブロックユーザーの観点から、私の2セントだが、私は専門家のどれもよん...