このブロックメソッドを使用するにはどうすればよいですか?

ジンボブ

ブロックを使ったObjectiveCプログラミングについて少し混乱しています。

たとえば、次の方法があります。

.hで

- (void)downloadDataWithURLString:(NSString *)urlString
                completionHandler:(void(^) (NSArray * response, NSError *error))completionHandler;

.mで:

- (void)downloadedDataURLString:(NSString *)urlString
                completionHandler:(void (^)(NSArray *, NSError *))completionHandler {
// some things get done here. But what!?
}

私の主な質問は....この完了ハンドラーを実装するにはどうすればよいですか?配列とエラーで返される変数は何ですか?これはコードの1つの領域ですが、完了したときに何をすべきかをどのように指示すればよいですか?

名前

メソッド(ブロックの本体)によって実行されるコードを提供するのは、呼び出し元の責任です。そのコードを呼び出すのは実装者次第です。

簡単な例から始めるために、呼び出し元がurlStringを使用して配列を形成し、コールバックすることを望んでいたとすると、次のようになります。

- (void)downloadedDataURLString:(NSString *)urlString
                completionHandler:(void (^)(NSArray *, NSError *))completionHandler {

    NSArray *callBackWithThis = @[urlString, @"Look ma, no hands"];
    completionHandler(callBackWithThis, nil);
}

発信者はこれを行います:

- (void)someMethodInTheSameClass {

    // make an array
    [self downloadedDataURLString:@"put me in an array"
                   completionHandler:^(NSArray *array, NSError *error) {
        NSLog(@"called back with %@", array);
    }];
 }

呼び出し元は、@ "put me in aarray"と@ "Look ma、nohands"を使用して2項目の配列をログに記録します。より現実的な例では、何かのダウンロードが終了したときに誰かが電話をかけ直すように頼んだとします。

- (void)downloadedDataURLString:(NSString *)urlString
                completionHandler:(void (^)(NSArray *, NSError *))completionHandler {
    // imagine your caller wants you to do a GET from a web api
    // stripped down, that would look like this

    // build a request
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // run it asynch
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if (!error) {
            // imagine that the api answers a JSON array.  parse it
            NSError *parseError;
            id parse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&parseError];

            // here's the part you care about:  the completionHandler can be called like a function.  the code the caller supplies will be run
            if (!parseError) {
                completionHandler(parse, nil);
            } else {
                NSLog(@"json parse error, error is %@", parseError);
                completionHandler(nil, parseError);
            }
        } else {
            NSLog(@"error making request %@", error);
            completionHandler(nil, error);
        }
    }];

    // remember, this launches the request and returns right away
    // you are calling the block later, after the request has finished
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このクラスでパブリック変数とメソッドを使用するにはどうすればよいですか?

分類Dev

Kotlinのtry-with-resourcesブロックでストリームを返すSpringData JPAメソッドを使用するにはどうすればよいですか?

分類Dev

RustのStreamExt :: scanメソッドを使用して非同期ブロック内の状態を変更するにはどうすればよいですか?

分類Dev

このメソッドでArrayListを使用するにはどうすればよいですか?

分類Dev

JCodeModelを使用してこのメソッドを生成するにはどうすればよいですか

分類Dev

Javaでオブジェクトメソッドを使用するにはどうすればよいですか?

分類Dev

defaultdictを継承し、そのコピーメソッドをサブクラスメソッドで使用するにはどうすればよいですか?

分類Dev

シェフの別のクックブックのライブラリメソッドを使用するにはどうすればよいですか?

分類Dev

JavaScriptメソッドを他のバックボーンメソッドで使用できるようにするにはどうすればよいですか?

分類Dev

Rails 4:この長いコントローラーメソッドでロジックを分離するにはどうすればよいですか?

分類Dev

メソッドの親オブジェクトを取得するにはどうすればよいですか?

分類Dev

階層の親クラスのメソッドを使用するにはどうすればよいですか?

分類Dev

メソッドがブロックせずに開始されたタスクを返すようにするにはどうすればよいですか?

分類Dev

独自のアダプタメソッドで特性オブジェクトを使用できるようにするにはどうすればよいですか?

分類Dev

このメソッドからの出力を逆にするにはどうすればよいですか?

分類Dev

ロックのような使用パターンでメソッドを作成するにはどうすればよいですか?

分類Dev

このメソッドをより簡潔に構築するにはどうすればよいですか?

分類Dev

ブロックの存続期間中持続するRubyメソッドを作成するにはどうすればよいですか?

分類Dev

ScalaTest-最終的にブロック内のメソッドが実行された回数を確認するにはどうすればよいですか?

分類Dev

コントローラ内のすべてのパブリック関数メソッドを取得するにはどうすればよいですか?

分類Dev

ブロックを含むobjCのメソッドをオーバーライドするにはどうすればよいですか?

分類Dev

これらのメソッドを一般的にするにはどうすればよいですか?

分類Dev

Pythonでグローバルオブジェクトのメソッドをモックするにはどうすればよいですか?

分類Dev

toStringを使用してクラスの情報を取得するにはどうすればよいですか?また、このクラスの「GPA」を計算するためのメソッドを取得するにはどうすればよいですか?

分類Dev

正規表現を使用してメソッドブロックを照合するにはどうすればよいですか?

分類Dev

あるクラスのオブジェクトを別のクラスのメソッドで使用するにはどうすればよいですか?

分類Dev

プロパティへのメソッドアクセスを使用するときに@AttributeOverridesを使用するにはどうすればよいですか?

分類Dev

このreload()メソッドをonLongClickメソッドに使用するにはどうすればよいですか?

分類Dev

このメソッドを再利用可能にするにはどうすればよいですか?

Related 関連記事

  1. 1

    このクラスでパブリック変数とメソッドを使用するにはどうすればよいですか?

  2. 2

    Kotlinのtry-with-resourcesブロックでストリームを返すSpringData JPAメソッドを使用するにはどうすればよいですか?

  3. 3

    RustのStreamExt :: scanメソッドを使用して非同期ブロック内の状態を変更するにはどうすればよいですか?

  4. 4

    このメソッドでArrayListを使用するにはどうすればよいですか?

  5. 5

    JCodeModelを使用してこのメソッドを生成するにはどうすればよいですか

  6. 6

    Javaでオブジェクトメソッドを使用するにはどうすればよいですか?

  7. 7

    defaultdictを継承し、そのコピーメソッドをサブクラスメソッドで使用するにはどうすればよいですか?

  8. 8

    シェフの別のクックブックのライブラリメソッドを使用するにはどうすればよいですか?

  9. 9

    JavaScriptメソッドを他のバックボーンメソッドで使用できるようにするにはどうすればよいですか?

  10. 10

    Rails 4:この長いコントローラーメソッドでロジックを分離するにはどうすればよいですか?

  11. 11

    メソッドの親オブジェクトを取得するにはどうすればよいですか?

  12. 12

    階層の親クラスのメソッドを使用するにはどうすればよいですか?

  13. 13

    メソッドがブロックせずに開始されたタスクを返すようにするにはどうすればよいですか?

  14. 14

    独自のアダプタメソッドで特性オブジェクトを使用できるようにするにはどうすればよいですか?

  15. 15

    このメソッドからの出力を逆にするにはどうすればよいですか?

  16. 16

    ロックのような使用パターンでメソッドを作成するにはどうすればよいですか?

  17. 17

    このメソッドをより簡潔に構築するにはどうすればよいですか?

  18. 18

    ブロックの存続期間中持続するRubyメソッドを作成するにはどうすればよいですか?

  19. 19

    ScalaTest-最終的にブロック内のメソッドが実行された回数を確認するにはどうすればよいですか?

  20. 20

    コントローラ内のすべてのパブリック関数メソッドを取得するにはどうすればよいですか?

  21. 21

    ブロックを含むobjCのメソッドをオーバーライドするにはどうすればよいですか?

  22. 22

    これらのメソッドを一般的にするにはどうすればよいですか?

  23. 23

    Pythonでグローバルオブジェクトのメソッドをモックするにはどうすればよいですか?

  24. 24

    toStringを使用してクラスの情報を取得するにはどうすればよいですか?また、このクラスの「GPA」を計算するためのメソッドを取得するにはどうすればよいですか?

  25. 25

    正規表現を使用してメソッドブロックを照合するにはどうすればよいですか?

  26. 26

    あるクラスのオブジェクトを別のクラスのメソッドで使用するにはどうすればよいですか?

  27. 27

    プロパティへのメソッドアクセスを使用するときに@AttributeOverridesを使用するにはどうすればよいですか?

  28. 28

    このreload()メソッドをonLongClickメソッドに使用するにはどうすればよいですか?

  29. 29

    このメソッドを再利用可能にするにはどうすればよいですか?

ホットタグ

アーカイブ