2014-04-17 4 views
0

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!

+0

Désolé. Traduit les commentaires dans le code. – njc

Répondre

1

Vous pouvez utiliser AFNetworking pour les appels d'API. Tutorial expliquant en détails comment l'utiliser de la bonne manière.Egalement, vous pouvez utiliser NSNotificationCenter pour informer le contrôleur de vue lorsque l'appel est réussi/échouer

+0

J'ai pensé à la notification et delegirovanii.To là, je vais devoir faire à l'intérieur de la notification de bloc pour voir le contrôleur? – njc

+0

Je ne suis pas sûr d'avoir compris votre question – wootage

+0

Je suis intéressé par la mise en œuvre. Dans l'architecture spécifiée, comment feriez-vous la notification? – njc

0

Premièrement, vous pouvez exécuter un bloc sur le thread principal en utilisant dispatch_sync. Mais ce n'est pas vraiment le problème ici. Vous essayez d'en faire trop dans un bloc de code.

Votre flux doit ressembler à ceci:

  1. Avez-vous enregistré un nom d'utilisateur/mot de passe?
  2. Sinon, demandez un
  3. Exécutez votre requête réseau
  4. Gestion des erreurs comprendrait la recherche d'informations d'identification non valides, auquel cas la demande serait annulée et votre code sauterait à l'étape 2.
+0

Pourquoi penses-tu que je veux en faire trop dans un bloc? Je veux juste accepter la réponse et la donner plus loin dans THETALEAPI. J'ai essayé d'utiliser 'code' dispatch_sync 'code', mais le programme n'a pas attendu l'exécution du bloc.Ma question est de savoir comment mettre en œuvre ce que vous avez décrit dans la liste. – njc

+0

@njc Le paragraphe du texte sous votre code suggère que vous souhaitiez demander à l'utilisateur de se connecter _during_ à la demande réseau, c'est-à-dire que la demande réseau attende que l'utilisateur ait obtenu les informations avant de continuer. Ce n'est pas comme ça que ça doit marcher. Vous devez obtenir les informations d'identification, puis effectuer la demande. –

+0

Probablement que j'ai mal expliqué. Vous avez déjà des informations d'identification, l'utilisateur les saisit. Maintenant, je veux attendre une réponse, et en fonction de la réponse à afficher des informations à l'interface utilisateur. – njc

Questions connexes