Ios 在后台运行parse.com查询后,如何使用该查询中的数据填充UITableView?

Ios 在后台运行parse.com查询后,如何使用该查询中的数据填充UITableView?,ios,objective-c,uitableview,parse-platform,Ios,Objective C,Uitableview,Parse Platform,我有一个UITableViewController,负责显示一张满是员工的表格。此数据存储在parse.com上的数据库中 这是我的UITableViewController,我只是在其中启动存储: -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nil bundle:nil]; if(self){

我有一个
UITableViewController
,负责显示一张满是员工的表格。此数据存储在parse.com上的数据库中

这是我的
UITableViewController
,我只是在其中启动存储:

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nil bundle:nil];
    if(self){
        store = [[EmployeeStore alloc] init]; 
    }
    return self;
}
这是
EmployeeStore
init方法,我在其中查询员工:

-(id) init{
    self = [super init];
    if(self){
        employees = [[NSMutableArray alloc] init];
        [self fetchEmployeesFromDatabase];
    }
    return self;
}
fetchEmployeesFromDatabase
,我在这里查询员工

-(void) fetchEmployeesFromDatabase{
    PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);
            // Do something with the found objects
            for (PFObject *object in objects) {
                NSLog(@"%@", object.objectId);
                [employees addObject:object]; 
            }
        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}

我正在成功地接收它们,但是问题是查询是在后台进行的,并且直到加载完表视图之后才完成,因此表视图不会填充。我需要让表在查询完成后重新加载其数据,但我该怎么做呢

加载完成后,告诉表视图重新加载

if (!error) {
    // The find succeeded.
    NSLog(@"Successfully retrieved %d scores.", objects.count);
    // Do something with the found objects
    for (PFObject *object in objects) {
        NSLog(@"%@", object.objectId);
        [employees addObject:object]; 
    }

    dispatch_async(dispatch_get_main_queue(), ^ {
        [tableView reloadData];
    });
} else {
您需要确保您的员工存储是线程安全的,或者后台和主线程不会同时访问

-(void) fetchEmployeesFromDatabase{
PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        // The find succeeded.
        NSLog(@"Successfully retrieved %d scores.", objects.count);
        // Do something with the found objects
        for (PFObject *object in objects) {
            NSLog(@"%@", object.objectId);
            [employees addObject:object]; 
        }
    } else {
        // Log details of the failure
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }
    [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:NO];
}];
}

-(void)reloadTableView{
    [self.aTableview reloadData];
}
现在在主线程上加载tableview。试试这个。

UITableViewController 雇员商店 雇员商店 并从数据库中获取员工

-(void) fetchEmployeesFromDatabase{
    PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);
            // Do something with the found objects
            for (PFObject *object in objects) {
                NSLog(@"%@", object.objectId);
                [employees addObject:object]; 
            }

             dispatch_async(dispatch_get_main_queue(), ^ {
                [self.tableView reloadData];
              });

        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}

在这里,即使在表视图完成之前,数据也会填充到表中。
您只需在此处放置语句[self-fetchEmployeesFromDatabase]内部viewDidLoad()方法或调用表创建的任何方法。

除了集合视图之外,我遇到了这个问题。在经历了很多痛苦之后,这成功地通过主线程重新加载了数据

dispatch_async(dispatch_get_main_queue(), ^ {
            [self.collectionView reloadData];
            [self.collectionView reloadItemsAtIndexPaths:[self.collectionView   indexPathsForVisibleItems]];
        });

很抱歉,我是否将其放入我的
UITableViewController
的init方法中,这到底是做什么的?我还没有学会积木。一个快速的解释将不胜感激!此块将在后台执行fetch,tableview将在主线程中更新谢谢,这完成了任务。我很感激@ByronS:不要将
reloadData
调用放在for循环内部,而是放在外部。为什么不使用
[self.aTableview performselector或onmainthread:@selector(reloadData)with object:nil waitUntilDone:NO]
而不是
[self-performSelectorOnMainThread:@selector(reloadTableView)with-object:nil waitUntilDone:NO]?是的,但我认为不需要编写单行函数
-(id) init{
    self = [super init];
    if(self){
        employees = [[NSMutableArray alloc] init];
        [self fetchEmployeesFromDatabase];
    }
    return self;
}
-(void) fetchEmployeesFromDatabase{
    PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);
            // Do something with the found objects
            for (PFObject *object in objects) {
                NSLog(@"%@", object.objectId);
                [employees addObject:object]; 
            }

             dispatch_async(dispatch_get_main_queue(), ^ {
                [self.tableView reloadData];
              });

        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}
dispatch_async(dispatch_get_main_queue(), ^ {
            [self.collectionView reloadData];
            [self.collectionView reloadItemsAtIndexPaths:[self.collectionView   indexPathsForVisibleItems]];
        });