使用块外的属性:findObjectsInBackgroundWithBlock:

时间:2013-12-13 18:26:18

标签: objective-c objective-c-blocks

我使用parse.com作为数据库,我有一个查询来检索数据。虽然我看到多个线程,但我无法找到我的代码的解决方案。

我在tableViewController的viewDidLoad中运行查询。

    PFQuery *exerciciosQuery = [PFQuery queryWithClassName:@"_User"];
    [exerciciosQuery includeKey:@"exercicios"];
    [exerciciosQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    exerciciosArray = objects;
    [self.tableView reloadData];
    NSLog(@"%@", objects);
}];

我需要根据查询结果显示tableView:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath object:(PFObject *)object {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Configure the cell
    PFObject *exercicios = [exerciciosArray objectAtIndex:indexPath.row];
    [cell.textLabel setText:[exercicios objectForKey:@"Title"]];

    return cell;
}

问题是,如果不在块内,属性* exerciciosArray为null。因此,我不知道如何解决这个问题,以便在我的tableviewcells上显示查询结果。

由于

1 个答案:

答案 0 :(得分:1)

执行exerciciosArray = objects;并不符合您的想法。您正在分配exercisiosArray的副本,而不是原始变量或属性。那个副本只存在于。您可以在ivar声明中使用__block。这将告诉运行时使用块中的原始变量,而不是创建副本。

[编辑]以上段落不正确。块中使用的Ivar永远不会被复制,而是通过self隐式引用,它保留在块中。将__block修饰符添加到ivar没有任何区别。分配到块内的ivar是可以的。这是Objective-C的一个有点微妙的观点,没有详细记录。

所以你有两个选择:

  1. __block添加到声明中(如果exerciciosArray是iVar)。 [编辑]这是不必要的。请参阅上面的编辑。

  2. 如果exerciciosArray是属性,请将exerciciosArray设为NSMutableArray。然后,您可以通过执行[exerciciosArray addObjectsFromArray:objects];

  3. 来获取元素

    不要忘记在适当的时候[[exerciciosArray alloc] init]