0

这是关于块句的问题。我的问题是如何在块语句中获取变量。请看我的代码。下面的代码效果不佳。

__block NSURL *ssURL
AFJSONRequestOperation *operation = 
[AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    ssURL = [NSURL URLWithString:[JSON valueForKeyPath:@"screenshot"]];
    [self currentEntry].ogImageURL = ssURL;
    NSLog(@"%@", ssURL); // -> "http://correct.address"   
} failure:nil];
[operation start];

此外,我将变量 ogImageURL 设置如下:

@property (copy, atomic) NSURL *ogImageURL;

在完成块之外,NSLog 明显显示“(null)”。我想在语句块之外使用变量。这很奇怪。

我必须从块外部获取变量,因为我想创建表格视图,其中单元格调用以获取数组的自我信息。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = nil;
    if (indexPath.row < self.itemsArray.count) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

        UIImageView *imageViewOgImage = (UIImageView *)[cell viewWithTag:5];
        NSURL *ogImageURL = [[self.itemsArray objectAtIndex:indexPath.row] ssURL];

完整来源是第 186 行:https ://github.com/weed/p120711_TechMovie/blob/120723/TechMovie/RSSParser.m

4

2 回答 2

3

这不是范围问题,这是时间问题

在第一个示例中,图像视图是在块内设置的,这意味着它只会在ssURL设置值之后发生

在第二个示例中,创建了块,但在设置图像视图之前不调用该块。该块是异步的,因此不会立即调用:它在操作返回响应时运行。如果您基于 JSON 请求操作设置图像视图,则必须在设置操作结果后完成(即在完成块内)

如果你的tableview依赖于操作的结果,那么设置ssURL的值然后在block里面,重新加载table view

于 2012-08-05T23:09:42.940 回答
0

我假设AFJSONRequestOperation JSONRequestOperationWithRequest是一个异步方法,在这种情况下,在第二个示例中,您将设置 self.imageView 为self.ssURL您分派JSONRequestOperation. 您必须在成功完成块中设置图像,就像在第一个示例中所做的那样。

于 2012-08-05T23:11:25.467 回答