等待AFNetworking GET请求

时间:2014-06-25 19:10:01

标签: ios objective-c json core-location

我正在使用AFNetworking为路线上的所有当前公交车获取JSON。我想要做的是当用户打开视图时,它将显示所有总线作为引脚(现在)。我解析出所有的JSON并拥有我所有的车辆对象。

问题在于,当我运行该方法来获取JSON时,它是异步的,这意味着当运行方法调用之后的代码行时,我还没有数据。

viewDidLoad我有:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self findCampus];
    _myMap.mapType = MKMapTypeHybrid;
    model = [[ShuttleModel alloc]init];
    [model getMapVehiclePoints];

    [self placeCurrentVehicles];
    // Do any additional setup after loading the view.
} 

getMapVehiclePoints中的model.m位于:

-(void)getMapVehiclePoints
{
    _vehicles = [service GetMapVehiclePoints];
}

ShuttleService.m我有以下两种方法:

- (void)getMapVehiclePointsWithCallback:(CallbackBlock)callback {


    NSString *methodURL = [NSString stringWithFormat:@"%@GetMapVehiclePoints", BASE_URL];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:methodURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        if (callback) callback([self parseVehicles:(id)responseObject]);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        if (callback) callback(@[]);
    }];

}

-(NSArray *)GetMapVehiclePoints;
{

    __block NSArray *vehicles = [[NSArray alloc]init];
    [self getMapVehiclePointsWithCallback:^(NSArray *vehiclePoints) {
        vehicles = vehiclePoints;
    }];
    return vehicles;
}

当我在模型中获取返回的数组以呈现给视图时它没有对象,因为GET尚未完成,我怎样才能预先加载它们或者等待它们加载然后再转到{{1 }}?

1 个答案:

答案 0 :(得分:3)

将使用新点的所有代码放入单独的方法中,并在数据到达时从成功回调中调用该代码。您还可以在发出请求时显示活动指示符,并在此方法中隐藏它。

您可以预先请求数据,但一般情况下,如果用户没有请求,您可以尽可能少地工作。

总线路线不太可能发生太大变化或经常变化,每次获得响应时都可以使用Core Data存储它。现在,当您需要数据时,可以从数据存储中获取数据,然后请求更新数据。通过这种方式,您可以向用户显示他们已经立即查看的路线,然后在短时间内更新任何更改。此模型还将支持以前查看过的路线的离线显示。