-(void) queryRestuarantsName {
NSMutableArray* restaurantNameArray = [[NSMutableArray alloc] init];
PFQuery *query = [PFQuery queryWithClassName:@"Menus"];
[query selectKeys: @[@"Resturant", @"Description", @"Name"]];
query.limit = 1000000;
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (PFObject *object in objects) {
NSString* restaurant = [object objectForKey: @"Resturant"];
[restaurantNameArray addObject:restaurant];
}
}];
}
目前,在for循环之外,restaurantNameArray
被认为是空的。但是,在for循环中,它有对象。如何访问循环之外的对象?
它是异步代码。在findObjectsInBackgroundWithBlock收到结果之前,对restaurantNameArray的任何访问都将返回空结果。
因此,只有在findObjectsInBackgroundWithBlock得到结果后,才能对数组中的数据进行任何处理。您可能预期以下代码会起作用:
[self queryRestuarantsName];
[self.tableView reloadData];
但它不会,因为此时数据将不会被加载。而不是在收到回复后立即重新加载数据。
如前所述,您正在使用异步任务。把它想象成程序只会通过这个块,然后在它准备好时返回到它。在您的情况下,您可以使用块来返回补货商名称,然后重新加载数据:
-(void)reloadAfterQuery
{
[self queryRestuarantsName:^(NSArray *restorantNames) {
//store names, reload table,collection view etc
}];
}
-(void) queryRestuarantsName:(void(^)(NSArray* restorantNames))callback
{
NSMutableArray* restaurantNameArray = [[NSMutableArray alloc] init];
PFQuery *query = [PFQuery queryWithClassName:@"Menus"];
[query selectKeys: @[@"Resturant", @"Description", @"Name"]];
query.limit = 1000000;
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (PFObject *object in objects) {
NSString* restaurant = [object objectForKey: @"Resturant"];
[restaurantNameArray addObject:restaurant];
}
callback(restaurantNameArray);
}];
}
在块内填充数组后,只需在块内使用它,或者只需通过调用使用该数组的方法(代码(来使用它。
就像使用数组作为数据源一样,然后在块内重新加载表。