0

AFJSONRequestOperationJSON フィードから 1 つのデータを取得するために使用しようとしています。

次のコードは URL を正しく取得し、stringURL が出力されると正しい URL を出力します。ただし、ブロックの範囲外で、url を新しい変数に割り当てるいくつかの異なる方法を試しました。結果のURLを別のグローバルに割り当てようとするかNSURL(必ず使用して__blockください)、配列に追加しようとしても、NSLogに出力するのに間に合わないようです。これは、操作が完了していないためだと思われます。を呼び出す前に操作が完了していることを確認するにはどうすればよいNSLog([streamUrls objectAtIndex:0]);ですか?

これが私が使用しているコードです。

    NSURL *url = [contentUrls objectAtIndex:indexPath.row];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSONSound) {

    NSString *stringURL = [NSString stringWithFormat:@"%@",
                           JSONSound[@"stream_url"], nil];

    NSURL *streamURL = [NSURL URLWithString:stringURL];
    NSLog(stringURL);
    [streamUrls addObject:streamURL];
    [self.collectionView reloadData];
} failure:nil];
[operation start];

NSLog([streamUrls objectAtIndex:0]);

編集:[self.collectionView reloadData];この行は状況に影響を与えないようです。

4

1 に答える 1

3

コードを呼び出す前に操作が完了していることを確認するには、AFJSONRequestOperation の成功ブロックを使用できます。これは、オブジェクトを streamUrls に追加するときに行ったことです。

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSONSound) {
    NSString *stringURL = [NSString stringWithFormat:@"%@",
                       JSONSound[@"stream_url"], nil];

    NSURL *streamURL = [NSURL URLWithString:stringURL];
    NSLog(stringURL);
    [streamUrls addObject:streamURL];
    [self.collectionView reloadData];
    NSLog([streamUrls objectAtIndex:0]);
} failure:nil];

reloadData はデータ ソースには影響しません。データ ソースに基づいて表示されるコレクション ビューを更新するだけです (データ ソースが更新されているかどうかに関係なく)。

于 2013-06-05T06:01:20.577 に答える