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