1

次のコードは、このチュートリアルから取得したものです

以前にこのスニペットを使用したことがありますが、これまでこの問題に気づいたことはありませんでした。配列の内容の NSLog はデリゲート メソッドに出力されますが、成功ブロックの外側の viewDidLoad には出力されません。コードの他の場所で使用するために、JSON データを配列に保存する方法が必要です。また、データを表示するために UITableView を使用していないことも付け加えておく必要があります。何が欠けているのか、どうすればこれを達成できますか?

これは、配列にデータを入力すると考えられる JSON コンテンツを出力しません。

#import "AFNetworking.h"
...
- (void)viewDidLoad {
...

self.movies = [[NSArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        self.movies = [JSON objectForKey:@"results"];
        [self.activityIndicatorView stopAnimating];
        [self.tableView setHidden:NO];
        [self.tableView reloadData];

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];

    [operation start];

    NSLog(@"self.movies %@",self.movies); // does not print
...
}

これにより、JSON コンテンツが出力されます。NSLog ステートメントの別の場所として numberOfRowsInSection のみを使用しました。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.movies && self.movies.count) {
        NSLog(@"self.movies %@",self.movies); // prints
...
}
4

1 に答える 1

3

非同期操作を開始し、すぐに内容を出力しようとしています。最初のNSLogステートメントを成功ブロックに移動します。

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    //the following lines of code execute after the response arrives
    self.movies = [JSON objectForKey:@"results"];
    NSLog(@"self.movies %@",self.movies);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
[operation start];
//this line of code executes directly after the request is made, 
//and the response hasn't arrived yet
NSLog(@"I probably don't have the response yet");
于 2012-12-28T04:46:30.643 に答える