我使用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上显示查询结果。
由于
答案 0 :(得分:1)
执行exerciciosArray = objects;
并不符合您的想法。您正在分配exercisiosArray的副本,而不是原始变量或属性。那个副本只存在于。您可以在ivar声明中使用__block
。这将告诉运行时使用块中的原始变量,而不是创建副本。
[编辑]以上段落不正确。块中使用的Ivar永远不会被复制,而是通过self
隐式引用,它保留在块中。将__block
修饰符添加到ivar没有任何区别。分配到块内的ivar是可以的。这是Objective-C的一个有点微妙的观点,没有详细记录。
所以你有两个选择:
将__block
添加到声明中(如果exerciciosArray
是iVar)。 [编辑]这是不必要的。请参阅上面的编辑。
如果exerciciosArray
是属性,请将exerciciosArray
设为NSMutableArray
。然后,您可以通过执行[exerciciosArray addObjectsFromArray:objects];
不要忘记在适当的时候[[exerciciosArray alloc] init]
。