AFJSONRequestOperation 不更新块外的内容

Posted

技术标签:

【中文标题】AFJSONRequestOperation 不更新块外的内容【英文标题】:AFJSONRequestOperation not updating content outside of block 【发布时间】:2013-06-05 04:34:51 【问题描述】:

我正在尝试使用 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]; 这一行似乎没有影响这种情况。

【问题讨论】:

【参考方案1】:

为了确保在调用任何代码之前操作已经完成,您可以使用 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 不会影响数据源。只是刷新基于数据源显示的集合视图(无论数据源是否更新)。

【讨论】:

以上是关于AFJSONRequestOperation 不更新块外的内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFJSONRequestOperation 返回 JSON

未知类型名称 AFJSONRequestOperation

AFJSONRequestOperation 不更新块外的内容

如何在AFJSONRequestOperation的回调中从NSHTTPURLResponse中获取响应数据?

如何使用 AFJSONRequestOperation 获取 HTTP 响应

iOS AFJSONRequestOperation 返回空结果