我正在使用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 }}?
答案 0 :(得分:3)
将使用新点的所有代码放入单独的方法中,并在数据到达时从成功回调中调用该代码。您还可以在发出请求时显示活动指示符,并在此方法中隐藏它。
您可以预先请求数据,但一般情况下,如果用户没有请求,您可以尽可能少地工作。
总线路线不太可能发生太大变化或经常变化,每次获得响应时都可以使用Core Data存储它。现在,当您需要数据时,可以从数据存储中获取数据,然后请求更新数据。通过这种方式,您可以向用户显示他们已经立即查看的路线,然后在短时间内更新任何更改。此模型还将支持以前查看过的路线的离线显示。