2

ブロック内のNSStringに値を設定する際に問題があります。

__block NSString *cityID = [[NSString alloc] init];
AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json) {
                                         cityID = [NSString stringWithFormat:@"%@",[[json valueForKeyPath:@"location"] valueForKey:@"id"]];
                                         NSLog(@"city id for 621352674 = %@",cityID);
                                     } failure:nil]; 
[operation start];
NSLog(@"city id for 621352674 = %@",cityID);

最初のNSLogは、cityIDの正しい値を示しています。しかし、2番目は私に何も示していません。この問題を解決する方法は?

4

2 に答える 2

4

2つ目NSLog()は、ブロックが完了するのを待っていません。これが実際の操作のポイントです。バックグラウンドで実行されているため、データがネットワーク経由でフェッチされている間、メインスレッドとアプリのUIがロックされません。操作を開始した直後にその呼び出しに到達しても、その文字列の値は変更されていません。sの文字列のリテラル部分を変更した場合NSLog()

                             NSLog(@"In Block: city id for 621352674 = %@",cityID);
                                 } failure:nil]; 
[operation start];
NSLog(@"After operation start: city id for 621352674 = %@",cityID);

何が起こっているのかが明確になるかもしれません。

于 2012-05-07T19:58:57.880 に答える
3

実際には、2番目のNSLogが最初になり、最初のNSLogがその後になります...したがって、フィードバックとして受け取るものは正しいものです。問題ありません。操作が完了すると、文字列の値が設定されます。

于 2012-05-07T19:59:06.503 に答える