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

我有一个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初始化方法,我在这里查询雇员:

 -(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]); } }]; } 

我成功地接收他们,但问题是查询发生在后台,并没有完成,直到表视图完成加载后,所以表视图不会填充。 查询完成后,我需要让表重新加载数据,但是我该如何去做呢?

的UITableViewController

 -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nil bundle:nil]; if(self){ store = [[EmployeeStore alloc] init]; store.tableView = self.tableView; } return self; } 

EmployeeStore.h

 @property (nonatomic, strong) UITableView *tableView; 

EmployeeStore.m

 -(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]; } dispatch_async(dispatch_get_main_queue(), ^ { [self.tableView reloadData]; }); } 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]; } 

现在你在mainthread上加载你的tableview。 尝试这个。

这里甚至在表视图完成之前,数据被填充到表中。 你所需要做的就是放置语句[self fetchEmployeesFromDatabase]; 里面的viewDidLoad()方法或调用您的表创build的任何方法。

我有这个问题,收集视图除外。 经过很多痛苦之后,这个窍门通过主线程重新加载数据。

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