Я новичок в iOS, и у меня есть проблемы с пониманием и применением хорошей диспетчеризации ... У меня есть приложение, мне нужно запросить веб-сайт (api) в цикле for, конец этого цикла мне нужно сделать дополнительные запросы в другом цикле , и, наконец, по окончании обоих циклов нужно переключать взгляды.
Теперь у меня есть этот код (после долгих проб и ошибок, но все еще не работает):
dispatch_queue_t queue = dispatch_queue_create("threadServicios", DISPATCH_QUEUE_SERIAL);
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(queue, ^(void) {
NSLog(@"llego a buscar servicios por local");
for (NSDictionary *local in _arrLocalesTmp) {
[self getListaServiciosPorLocal:[local objectForKey:@"idLocal"]];
//this function calls another function that consumes a web service and get a json
}
procced = YES;
NSLog(@"llego a buscar profesionales por local");
for (NSDictionary *local in _arrLocalesTmp) {
[self getListaProfesionalesPorLocal:[local objectForKey:@"idLocal"]];
//this function calls another function that consumes a web service and get a json
}
procced2 = YES;
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_main_queue(),^{
NSLog(@"dispatch procced 1");
if (procced && procced2) {
[self setFormularioConsultaCompleto];
}
});
Функция [self getListaServiciosPorLocal: [Local objectForKey: @"idLocal"]]; составляет:
dispatch_async(dispatch_get_main_queue(), ^(void) {
NSURL *url = [NSURL URLWithString:urlConnection];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.timeoutIntervalForRequest = 30;
sessionConfiguration.timeoutIntervalForResource = 60;
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
__block NSError *jsonError;
NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *) response;
if(!error) {
if(urlResponse.statusCode == 200) {
NSDictionary *response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonError];
if(response) {
NSString *resp = [NSString stringWithFormat:@"%@", [dataResponse objectForKey:@"resp"]];
if([resp isEqualToString:@"1"]) {
_json = [dataResponse objectForKey:@"data"];
[_arrServiciosTmp addObjectsFromArray:(NSArray *)_json];
} else {
NSString *message = [dataResponse objectForKey:@"description"];
}
} else {
self.lblMensaje.text = @"Ha ocurrido un error al obtener la información, por favor, vuelva a intentarlo en unos momentos.";
}
} else {
completion(nil);
}
} else {
NSLog(@"Error en Task");
}
});
И функция [self getListaProfesionalesPorLocal: [Local objectForKey: @"idLocal"]]; похож, но получает другую информацию
Проблема в том, что приложение вызывает эту функцию [self setFormularioConsultaCompleto]; (изменение вида), но вышеперечисленные функции по-прежнему не совсем получают все данные из веб-сервиса.
Извините за это, но я сдался, надеюсь, вы мне поможете!
Спасибо!
dispatch_sync
блокирует до тех пор, пока блок не будет завершен. В чем проблема с приведенным выше кодом? - person Rich   schedule 24.04.2014queue
) на ваш вопрос, пожалуйста :) - person Rich   schedule 24.04.2014