我在viewDidLoad中使用以下代码来填充数组并记录计数:
PFQuery *query = [PFQuery queryWithClassName:@"Friends"];
[query whereKey:@"user" equalTo:[PFUser currentUser].username];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (Friends *currentFriend in objects) {
_relation = currentFriend.friendsRelation;
}
dispatch_async(dispatch_get_main_queue(), ^{
_query = [_relation query];
_array = [_query findObjects];
_array2 = [NSMutableArray arrayWithArray:_array];
});
}];
NSLog(@"count: %lu", [_array2 count]);
这个日志计数:0但是,当我将numberOfRowsInSection设置为1并将下面的代码放在cellForRowAtIndexPath中时,它会记录计数:1。为什么_array2的计数会丢失它的值在for之外循环?
PFQuery *query = [PFQuery queryWithClassName:@"Friends"];
[query whereKey:@"user" equalTo:[PFUser currentUser].username];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (Friends *currentFriend in objects) {
_relation = currentFriend.friendsRelation;
_query = [_relation query];
_array = [_query findObjects];
_array2 = [NSMutableArray arrayWithArray:_array];
NSLog(@"count: %lu", [_array2 count]);
}
dispatch_async(dispatch_get_main_queue(), ^{
_query = [_relation query];
_array = [_query findObjects];
_array2 = [NSMutableArray arrayWithArray:_array];
_friend = [_array2 objectAtIndex:indexPath.row];
cell.usernameLabel.text = [_friend objectForKey:@"user"];
cell.chosenText.text = [_friend objectForKey:@"text"];
});
}];
我从这里实现了解决方案,但它仍然给出了相同的结果:findObjectsInBackgroundWithBlock: gets data from Parse, but data only exists inside the block
答案 0 :(得分:1)
你根本不是'丢失数据'。相反,在查询完成之前,您的日志语句将被称为。
重要的是要理解,块中包含的代码通常(如果不是几乎总是)将在不确定的时间运行,可能在不同的线程上运行。 API通常会保存您传入的块,在后台线程上执行工作,然后在以后执行该块。
换句话说,想一想作为变量传递的代码块。 您正在调用的方法可以在(或从不)时执行。很明显,在执行该块之前,您的程序流将继续执行您的日志语句。
一个简单的设计模式包括块中的代码,用于刷新消耗数据的视图。
在这种情况下,简单的[self.tableView reloadData];
就足够了。但是,由于您的块将在不确定的线程(如后台线程)上执行,因此请确保调度到主线程以进行与UI相关的刷新!