Objective C 块和 For 循环

Objective C Blocks and For Loop

我正在尝试使用如下示例代码从服务器检索一些数据。然而,它给了我不可预测的结果。我不确定这是因为该块在循环内部或在内存中被覆盖时被释放。 基本上数据与我期望的指标不符。

-(void)retrieveSomeStuff {

    for (int i = 0 ; i < items.count; i++)
    {
        [self retrieveDataForIndex:i
                 completionHandler:^(NSDictionary *data, NSError *error) {


                 }];

    }
}

-(void) retrieveDataForIndex:i completionHandler:(void(^)(NSDictionary *,NSError*) completionHandler {

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        completionHandler(data,connectionError);
    }

}

处理这种情况的最佳方法是什么?

为了避免重新分配,您必须在方法 "retrieveDataForIndex" 中复制块。请参阅下面的修改。

typedef void(^CompletionHandler)(NSData * data, NSError * error);

-(void) retrieveDataForIndex:(NSInteger)i completionHandler:(CompletionHandler)Completion
{
   CompletionHandler _completionHandler = [Completion copy];
   NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.co.in"]];

 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
 {
     _completionHandler(data, connectionError);
     [_completionHandler release];
 }];
}

-(void)retrieveSomeStuff
{
    for (int i = 0 ; i < 10; i++)
    {
      [self retrieveDataForIndex:i completionHandler:^(NSData *data, NSError *error)
      {
         NSLog(@"\nData Received");
      }];
    }
}