web-dev-qa-db-ja.com

コールバックとして使用するブロックを取得するメソッドの実装

私はこれに似た方法を書きたいです:

+(void)myMethodWithView:(UIView *)exampleView completion:(void (^)(BOOL finished))completion;

基本的に、AppleのUIViewのクラスメソッドの1つから取った構文を削除しました。

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

そして、次のように使用されることを期待します。

[myFoo myMethodWithView:self.view completion:^(BOOL finished){
                     NSLog(@"call back success");
                 }];

私の質問は、これをどのように実装できますか?誰かが私にすばらしいドキュメントを教えてくれて、非常に基本的な例があれば非常にありがたいです(またはStack Overflowに関する同様の答え-私はそれを見つけることができませんでした)。デリゲートについては、それが正しいアプローチであるかどうかを判断するのに十分な知識がまだありません!

実装ファイルに予想される内容の大まかな例を記載しましたが、情報が見つからないので推測できます。

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    // do stuff

    if (completion) {
        // what sort of syntax goes here? If I've constructed this correctly!
    }

}
69
Chris

通常の関数のようにブロックを呼び出すことができます:

BOOL finished = ...;
if (completion) {
    completion(finished);
}

したがって、例を使用して完全なブロック関数を実装すると、次のようになります。

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    if (completion) {
        completion(finished);
    }
}
84
omz

何が起こっているのかを理解するために Blocks を読むことを強くお勧めします。

5
Chaitanya Gupta

ブロックを使用してカスタムメソッドを作成するために特別にドキュメントを探している場合は、次のリンクがそのほとんどすべてを説明しています。 :)

http://developer.Apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxUsing.html

私は最近、まったく同じ質問に答えて、これを見てみましょう: typedefを使用せずにブロックメソッドパラメーターを宣言します