如何访问保存在for循环中的数组?(目标c)


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

在块内填充数组后,只需在块内使用它,或者只需通过调用使用该数组的方法(代码(来使用它。

就像使用数组作为数据源一样,然后在块内重新加载表。

最新更新