2012-05-07 3 views
1

ブロック内のNSStringに値を設定する際に問題があります。ブロック内の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番目には何も見えません。どのようにこの問題をixにするのですか?

+0

[ブロックのint値を変更する方法](http://stackoverflow.com/questions/9997489/)ブロック内の値の変更方法) –

答えて

3

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

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

それは何が起こっているか、あなたに明らかになることがあります。

+0

わかりました。しかし、私はブロックの終わりの後に 'cityID'の新しい価値をどのように使うことができますか? – RomanHouse

+0

ブロックが実行されるまで値は変更されていないので、 'success'ブロックで何をする必要があれば何でもするか、実行する必要のある別のメソッドを呼び出す必要があります。 –

3

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

関連する問題