Задача C Сохранить изменения, сделанные блоком в собственность - PullRequest
1 голос
/ 17 сентября 2011

По какой-то причине этот код не работает:

[request setCompletionBlock:^{
    NSString *response = [request responseString];
    NSDictionary *data = [response JSONValue];
    NSArray *events = (NSArray *)[data objectForKey:@"objects"];

    for (NSMutableDictionary *event in events){

        /* experimental code*/
        NSString *urlString = [NSString 
                               stringWithFormat:
                               @"http://localhost:8000%@?format=json",
                               [event objectForKey:@"tournament"]];

        NSURL *url2 = [NSURL URLWithString:urlString];
        ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
        [request2 setCompletionBlock:^{
            NSString *responseString = [request2 responseString];
            NSDictionary *tournamentDict = [responseString JSONValue];
            self.tournamentString = [tournamentDict objectForKey:@"tournament"]; 
        }];
        [request2 startAsynchronous];

        /* end experimental code */
        NSLog(@"%@", self.tournamentString);
        [mutableArray addObject:event];
    }
    self.eventsArray = mutableArray;
    [MBProgressHUD hideHUDForView:self.view animated:YES];

    [self.tableView reloadData];
}];

, поэтому здесь есть 2 асинхронных запроса, в которых я запускаю один за другим.Я хочу изменить значение свойства airportText после выполнения второго запроса.

Внутри блока завершения для второго запроса, когда я NSLog self.tournamentText, он отображает текст, который я хочу получить.

За пределами блока NSLog создает ноль.

Что я могу сделать, чтобы сохранить изменения в self.tournamentText?Заранее спасибо!Пожалуйста, скажите мне, если я пропустил документацию Apple по этому вопросу.

1 Ответ

1 голос
/ 17 сентября 2011

Вы, вероятно, должны применить модификатор типа хранения __block к переменной (вне блока).

__ block NSDictionary * toursDict;

См. Документацию Apple о взаимодействии между блоками и переменными (в темах программирования блоков) для получения дополнительной информации.

Кстати, вы понимаете, что у вас есть блок внутри блока, а не два отдельных блока за другим? Чтобы сохранить изменения в переменной вне второго блока, попробуйте следующее:

[request setCompletionBlock:^{
    NSString *response = [request responseString];
    NSDictionary *data = [response JSONValue];
    NSArray *events = (NSArray *)[data objectForKey:@"objects"];

    for (NSMutableDictionary *event in events){

        /* experimental code*/
        NSString *urlString = [NSString 
                               stringWithFormat:
                               @"http://localhost:8000%@?format=json",
                               [event objectForKey:@"tournament"]];

        NSURL *url2 = [NSURL URLWithString:urlString];
        ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
        __block NSDictionary *tournamentDict;
        [request2 setCompletionBlock:^{
            NSString *responseString = [request2 responseString];
            tournamentDict = [responseString JSONValue];
            self.tournamentString = [tournamentDict objectForKey:@"tournament"]; 
        }];
        [request2 startAsynchronous];

        /* end experimental code */
        NSLog(@"%@", self.tournamentString);
        [mutableArray addObject:event];
    }
    self.eventsArray = mutableArray;
    [MBProgressHUD hideHUDForView:self.view animated:YES];

    [self.tableView reloadData];
}];
...