2

これは、AFNetworking のサンプル コードの抜粋です。

+ (void)globalTimelinePostsWithBlock:(void (^)(NSArray *posts, NSError *error))block {
    [[AFAppDotNetAPIClient sharedClient] getPath:@"stream/0/posts/stream/global" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) {
        NSArray *postsFromResponse = [JSON valueForKeyPath:@"data"];
        NSMutableArray *mutablePosts = [NSMutableArray arrayWithCapacity:[postsFromResponse count]];
        for (NSDictionary *attributes in postsFromResponse) {
            Post *post = [[Post alloc] initWithAttributes:attributes];
            [mutablePosts addObject:post];
        }

        if (block) {
            block([NSArray arrayWithArray:mutablePosts], nil);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (block) {
            block([NSArray array], error);
        }
    }];
}

私が理解していないのは次のとおりです。

  1. その(void (^)(NSArray *posts, NSError *error))block部分。ブロックだとすると、ブロックはglobalTimelinePostsWithBlockメソッドのパラメータということですか?

  2. 最初の質問に続いて、誰か構文を説明してもらえますか? なぜblock最後にキーワードがあるのですか?

4

3 に答える 3

2

ブロックの仕組みがわからない場合は、コードを見るだけで理解しようとしないでください (javascript や ruby​​ などの他の言語でラムダ/匿名関数を使用したことがある場合でも)。 Objective-C の構文は、それ自体がクラスです。

時間をかけて obj-c のブロック構文を独自に理解することをお勧めします..次に、それらを使用する例を見てください。このチュートリアルは優れています (2 部構成)。

私はあなたが前にしたことをしました..そして私の髪の半分を引き出しました..上記のチュートリアルを見た後..私の髪はすぐに元に戻りました:)


楽しみのために、私はあなたの特定の質問に対処しようとします:

1. (void (^)(NSArray *posts, NSError *error))ブロック部分。ブロックだとすると、そのブロックはglobalTimelinePostsWithBlockメソッドのパラメータということですか?

はい、そうです..これはこのメソッドを呼び出す方法です:

// first define the block variable
void(^block)(NSArray *posts, NSError *error) = (NSArray *posts,NSError *error) {

   // block body
   // posts and error would have been passed to this block by the method calling the block.
   // so if you look at the code sample below.. 
   // posts would be [NSArray arrayWithArray:mutablePosts]
   // and error would just be nil
}

// call the function
[AFNetworking globalTimelinePostsWithBlock:block];    

2. 最初の質問に続いて、構文を説明してくれる人はいますか? 最後に block キーワードがあるのはなぜですか?

基本的に、block キーワードは引数の名前です。メソッドの本体でどのように使用されているかに注目してください。

if (block) {
            block([NSArray arrayWithArray:mutablePosts], nil);
        }

もう一度どのように/なぜ理解するために..上記の記事を見ることをお勧めします..obj-c の学習ブロックには少し学習曲線があります..しかし、一度マスターすると..それは素晴らしいツールです. ここで私の回答を見て、ブロックの使用例を確認してください。

委任をブロックベースのアプローチに変換するケーススタディを提供するサンプルの質問/回答もあり、ブロックがどのように機能するかを説明することもできます

于 2013-07-17T05:05:53.870 に答える
1

ブロック定義は C 関数に似ています。

(void (^)(NSArray *posts, NSError *error))block
  • イニシャルvoidは、関数の戻り値の型を定義します。
  • ^ブロックポインタです。*for オブジェクトに似ています。
  • (NSArray *posts, NSError *error)変数名を持つパラメーターです。
  • blockこのブロックが格納される変数です。(ここはネーミングが悪い)
于 2013-07-17T05:07:55.970 に答える
1

ブロックは、API 呼び出しが成功したときに呼び出されるものとしてメソッドに渡されます。データ(および場合によっては)globalTimelinePostsWithBlockで渡されたブロックを呼び出しますNSError

blockこの場合はキーワードではなく、単なる変数の名前です。

を使用したい場合はglobalTimelinePostsWithBlock、次のように呼び出します

[ClassName globalTimelinePostsWithBlock:^(NSArray *posts, NSError *error) {
  // Check error, then do something with posts
}];

ClassNameクラスの名前globalTimelinePostsWithBlockが定義されている場所)

于 2013-07-17T05:04:27.750 に答える