0

我正在尝试AFJSONRequestOperation从 JSON 提要中提取一份数据。

以下代码很好地提取了 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 回答