0

我有个问题。我想更改块中的局部变量。我什么都试过了。我把变量 __block 的开始,但没有什么可以改变。我不能改变块中的 myString 值。你可以帮帮我吗 ?这是我的代码:

- (IBAction)setButtonPressed:(id)sender {
    placeName = [[[NSMutableString alloc] init] retain];
    __block NSMutableString *myString = [[NSMutableString alloc] init];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSDate *today = [NSDate date];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];

    [dateFormat setDateFormat:@"dd.MM.yyyy hh:mm:ss"];

    NSString *dateString = [dateFormat stringFromDate:today];

    [previousParkingLon addObject:[NSNumber numberWithFloat:self.longitude]];
    [previousParkingLat addObject:[NSNumber numberWithFloat:self.latitude]];
    [previousParkingsDate addObject:dateString];
    if((self.latitude != 0) && (self.longitude != 0))
    {
        self.geocoder = [[CLGeocoder alloc] init ];
        [self.geocoder reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) {
            CLPlacemark *myplacemark = [placemarks objectAtIndex:0];
            NSString *locatedAt = [[[myplacemark addressDictionary] objectForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
            [myString setString:locatedAt];
        }];
    }
        [previousParkingsPlaceName addObject:placeName];
    NSLog(@"Test %@",myString);
        [defaults setObject:previousParkingLat forKey:@"historyLat"];
        [defaults setObject:previousParkingLon forKey:@"historyLon"];
        [defaults setObject:previousParkingsDate forKey:@"historyDate"];
        [defaults setObject:previousParkingsPlaceName forKey:@"historyName"];


        [defaults synchronize];

} 
4

2 回答 2

1

当您在self.geocoder完成其操作时执行块时,在您输出之后locatedAt附加到(iOS 在继续之前不会执行块)。您会注意到,如果您将其放入块内,则该值将成功输出。myStringmyStringNSLogNSLog

如果您想使用 的值myString来执行操作,您有两种选择。第一种是包含在myString块内使用的代码,或者将其放在一个函数中并从块内调用该函数。不要将代码直接放在块之后!您的第二个选择是在使用myString. 创建一个具有全局范围的布尔值,然后在块中将布尔值设置为 YES。然后您可以在使用 的值之前检查 bool 是否设置为 YES myString

于 2013-03-24T01:17:17.970 回答
0

关键是地理编码器“异步”执行其完成块。到方法的其余部分运行时,该块将不会运行。

ps__block无论如何都是不必要的,因为您没有在myString任何地方分配给变量

于 2013-03-24T06:31:20.330 回答