0

インターネットで見つけたコードを理解しようとしています。自分のプログラムで使用できるように微調整しようとしています。私のプログラムでは、これをシングルトンのインスタンスメソッドにしました。私はこれが何をしているのかほとんど理解していますが、「ブロック」の部分は取得していません。ブロックは何ですか?私の実装では、NSSetPhotosの代わりにパラメーターとして何を渡す必要がありますか。私はこれを理解していません。なぜなら、私は実際にその場所のサーバーから写真を「取得」することを望んでいるからです。だから私は何を送っていますか?

 + (void)photosNearLocation:(CLLocation *)location
                 block:(void (^)(NSSet *photos, NSError *error))block
 {
    NSLog(@"photosNearLocation - Photo.m");
    NSMutableDictionary *mutableParameters = [NSMutableDictionary dictionary];
    [mutableParameters setObject:[NSNumber 
    numberWithDouble:location.coordinate.latitude] forKey:@"lat"];
    [mutableParameters setObject:[NSNumber 
    numberWithDouble:location.coordinate.longitude] forKey:@"lng"];

    [[GeoPhotoAPIClient sharedClient] getPath:@"/photos"
                               parameters:mutableParameters
                                  success:^(AFHTTPRequestOperation *operation, id JSON)
    {
      NSMutableSet *mutablePhotos = [NSMutableSet set];
      NSLog(@" Json value received is : %@ ",[JSON description]);
      for (NSDictionary *attributes in [JSON valueForKeyPath:@"photos"])
      {
        Photo *photo = [[Photo alloc]
                        initWithAttributes:attributes];
        [mutablePhotos addObject:photo];
      }

      if (block) {
        block([NSSet setWithSet:mutablePhotos], nil);
       }
     }failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
       if (block)
      {
        block(nil, error);
        NSLog(@"Error in Photo.m line 145 %@ ", [error description]);
       }
      }];
      }
4

1 に答える 1

2

写真セットのために何も渡す必要はありません。これはブロックのパラメーターです。呼び出し元の仕事は、メソッドが非同期作業を終了したときに呼び出されるブロックを渡すことです。だからあなたはそれをこのように呼ぶでしょう:

// let's setup something in the caller's context to display the result
// and to demonstrate how the block is a closure - it remembers the variables
// in it's scope, even after the calling function is popped from the stack.

UIImageView *myImageView = /* an image view in the current calling context */;

[mySingleton photosNearLocation:^(NSSet *photos, NSError *error) {
    // the photo's near location will complete some time later
    // it will cause this block to get invoked, presumably passing
    // a set of photos, or nil and an error
    // the great thing about the block is that it can refer to the caller context
    // as follows....

    if (photos && [photos count]) {
        myImageView.image = [photos anyObject];   // yay.  it worked
    } else {
        NSLog(@"there was an error: %@", error);
    }
}];
于 2012-10-19T04:44:32.160 に答える