解析:数组丢失查询之外的数据

时间:2015-05-29 20:34:34

标签: ios objective-c arrays parse-platform

我在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

1 个答案:

答案 0 :(得分:1)

你根本不是'丢失数据'。相反,在查询完成之前,您的日志语句将被称为

重要的是要理解,块中包含的代码通常(如果不是几乎总是)将在不确定的时间运行,可能在不同的线程上运行。 API通常会保存您传入的块,在后台线程上执行工作,然后在以后执行该块。

换句话说,想一想作为变量传递的代码块。 您正在调用的方法可以在(或从不)时执行。很明显,在执行该块之前,您的程序流将继续执行您的日志语句。

一个简单的设计模式包括块中的代码,用于刷新消耗数据的视图。

在这种情况下,简单的[self.tableView reloadData];就足够了。但是,由于您的块将在不确定的线程(如后台线程)上执行,因此请确保调度到主线程以进行与UI相关的刷新!