У меня есть программа с несколькими URL-запросами, поэтому я использовал код в http://snippets.aktagon.com/snippets/350-How-to-make-asynchronous-HTTP-requests-with-NSURLConnection и поместил его в свой собственный класс (класс B). Чтобы вызвать класс, я просто инициализирую класс B в классе A отправка URL-адреса в метод get класса B ([classname get: url]), а затем получение ответа сервера по возвращении.
Проблема в том, что я побежден условиями гонки из-за того, что метод didReceiveData: не завершен к моменту возвращения моего метода.
Я рассмотрел пример использования NSUrlConnection для разработчиков, и они обновляют представления, как только ответ наконец-то пришел, чтобы им не пришлось бороться с этой проблемой.
Большое спасибо за вашу помощь.
Мне нужно сохранять вызовы асинхронными из-за их количества, которое я должен сделать, но я открыт для любых предложений.
Редактировать (перенесено из ответа)
Я изменил код на GCD на основе учебника, и я все еще терплю поражение от состояния гонки. Вот код, который я использую сейчас:
Я изменил его на GCS, основываясь на вашем предложении, но я все еще попадаюсь на гонку. Ниже приведен код, на который я изменил его, и я вызываю его:
NSString * responseStringClassA = [InitalizedInstanceOfClassA LogIn: @ "username" @ "password"];
//Log into the server
-(NSString *)logIn: (NSString *) username password:(NSString *) password
{
NSString* returnString;
dispatch_queue_t downloadQueue = dispatch_queue_create("Login", NULL);
dispatch_async(downloadQueue, ^{
BOOL success = YES;
NSString *urlAsString =[NSString stringWithFormat:@""URL HERE];
NSLog(@"url sent out: %@", urlAsString);
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSError *error = nil;
NSData *connectionData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];
NSLog(@"Connection Data: %@", [[NSString alloc] initWithData:connectionData encoding:NSASCIIStringEncoding]);
[returnString isEqualToString:[NSString stringWithUTF8String:[connectionData bytes]]];
if ([connectionData length] > 0 && error == nil) {
//success
success = YES;
}
else if([connectionData length] == 0 && error == nil){
//nodata
success = YES;
}
else if(error != nil){
//error ..
success = NO;
}
dispatch_async(dispatch_get_main_queue(), ^{
[returnString isEqualToString:[[NSString alloc] initWithData:connectionData encoding:NSASCIIStringEncoding] ];
});
});
return returnString;
}