J'écris mon premier objectif d'application-c pour iOS 7.1. Je suis probablement quelque chose fondamentalement ne comprends pas pourquoi j'ai cette question a surgi.Création simple application ios en utilisant NSURLSession
L'application est assez simple: le client pour communiquer avec un service externe en utilisant api web. Pour envoyer une requête http, j'utilise NSURLSession. J'ai une architecture simple. THETALETestViewController - ce contrôleur de vue. Cette classe utilise THETALEAPI.h THETALEAPI - est la réalisation de l'API Web. J'ai mis en évidence dans une classe distincte, à chaque méthode API externe a été mis en œuvre en un seul endroit. Voici la formation d'une requête pour chaque méthode. Cette classe utilise THETALEHttpHandler.h. THETALEHttpHandler - cette classe est directement responsable de l'envoi de la requête http et de la réception de la réponse http.
Voici le code de THETALEHttpHandler.m pour envoyer une requête POST.
-(void) sendPostToURL:(NSURL *)url withParams: (NSString *) inParams competion:(void (^) (NSData *data)) completion
{
NSLog(@"sendPostToURL");
// _csrftoken a token in cookie
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"csrftoken" forKey:NSHTTPCookieName];
[cookieProperties setObject:_csrftoken forKey:NSHTTPCookieValue];
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[_httpCookieStorage setCookie:cookie];
[_sessionConfig setHTTPCookieStorage:_httpCookieStorage];
// tried and so
// // NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil //delegateQueue: [NSOperationQueue mainQueue]];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:_sessionConfig];
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];
// _csrftoken a token in the parameter
NSString *params = [@[inParams, _csrftoken] componentsJoinedByString:@""];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"Got response %@ with error %@.\n", response, error);
if(error == nil)
{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Data = %@",text);
}
completion(data);
}];
[dataTask resume];
}
Ainsi, l'achèvement du bloc n'est pas en cours d'exécution dans le thread principal, et de manière asynchrone, de sorte alors qu'une demande est envoyée et il y a une réponse de réception et de traitement - thread principal est exécuté. En principe, il est clair et logique, mais je veux "connecter" en utilisant cette méthode, respectivement, en cliquant sur le "Login" Je dois aller après une demande réussie et la réponse et le traitement de l'utilisateur devrait voir la réponse. Quelles sont les capacités iOS qui obtiennent un tel comportement au thread principal en attendant la fin du bloc asynchrone et affiche les informations appropriées? Ou peut-être que ça ne vaut pas la peine d'attendre, et il faut juste le signaler? A moins, bien sûr, de ne pas faire de classes séparées, et de tout faire dans viewController, alors, en supposant que les délégués viendraient, mais je veux faire un peu de modularité dans son application.
Peut-être que je me suis trompé de système conçu, alors vous pouvez expliquer ou montrer un exemple de la façon dont il est habituellement fait?
Je pense que cette exigence est plutôt banale et la réponse est quelque part à proximité, s'il vous plaît expliquer, merci d'avance!
Désolé. Traduit les commentaires dans le code. – njc