在句子之外变量使用

时间:2012-08-05 23:05:09

标签: iphone objective-c

这是关于阻止句子的问题。我的问题是如何在块句中得到变量。请看我的代码。以下代码效果不佳。

__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

2 个答案:

答案 0 :(得分:3)

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

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

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

如果你的tableview取决于操作的结果,那么设置ssURL的值然后在块内,重新加载表视图

答案 1 :(得分:0)

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