У меня есть следующий код внутри класса (статический метод), который я вызываю для получения данных из API. Я решил сделать это статическим методом, чтобы я мог повторно использовать его в некоторых других частях приложения.AFNetworking: Обработка запроса асинхронного запроса с AFJSONRequestOperation
+ (NSArray*) getAllRoomsWithEventId:(NSNumber *)eventId{
NSURL *urlRequest = [NSURL URLWithString:[NSString stringWithFormat:@"http://blablba.com/api/Rooms/GetAll/e/%@/r?%@", eventId, [ServiceRequest getAuth]]];
NSMutableArray *rooms = [[NSMutableArray alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:urlRequest];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"Response of getall rooms %@", JSON);
NSArray *jsonResults = (NSArray*)JSON;
for(id item in jsonResults){
Room* room = [[Room alloc]init];
if([item isKindOfClass:[NSDictionary class]]){
room.Id = [item objectForKey:@"Id"];
room.eventId = [item objectForKey:@"EventId"];
room.UINumber = [item objectForKey:@"RoomUIID"];
[rooms addObject:room];
}
}
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){
NSLog(@"Error");
}];
[operation start];
[operation waitUntilFinished];
return rooms;
}
Теперь мой вопрос, когда я называю это в (метод ViewDidLoad) ViewController. Статический метод будет работать до конца и будет возвращать нуль в комнатах, но Nslog отобразит блок «Успех» Nslog через несколько секунд после. Теперь я понимаю, что это асинхронно, поэтому он не дождался выполнения блока успеха до того, как он достигнет «комнат возврата»; линия. Со всем сказанным мне нужен совет относительно того, как справиться с этим, например, индикатор прогресса или что-то в этом роде? Или что-то, что задерживает его? Я не совсем уверен, что это лучший способ, или если это так, я не знаю, как это сделать.
Любые советы очень ценятся. Спасибо!
Поскольку «AFNetworking» является асинхронным процессом, вам рекомендуется использовать «NSNotificationCenter», который уведомит ваш код о том, что теперь у комнаты есть данные. –
@DeepakKhiwani Правильно относится к асинхронности, но обмен сообщениями лучше всего делать непосредственно с блоками обратного вызова, а не с уведомлениями. – mattt