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てアクションを実行する場合は、2 つのオプションがあります。1つ目は、ブロック内で使用するコードを含めるmyStringか、関数に配置してブロック内からその関数を呼び出すことです。ブロックの直後にコードを配置しないでください。2 番目のオプションは、 の値を使用する前にブロックが実行されたかどうかを確認することですmyString。グローバル スコープでブール値を作成し、ブロックでブール値を YES に設定します。の値を利用する前に、bool が YES に設定されているかどうかを確認できますmyString

于 2013-03-24T01:17:17.970 に答える
0

重要なのは、Geocoder がその完了ブロックを「非同期的に」実行することです。メソッドの残りの部分が実行されるまで、ブロックは実行されていません。

psどこにも変数__blockに代入していないので、とにかく不要ですmyString

于 2013-03-24T06:31:20.330 に答える