74 votes

comment utiliser sendAsynchronousRequest:file d'attente:completionHandler:

Deux partie de la question

Première partie: Je suis en train de créer une requête Asynchrone à ma base de données. Je suis actuellement en train de le faire de manière Synchrone cependant je veux apprendre à la fois des façons d'améliorer ma compréhension de ce qui se passe.

Actuellement, j'ai mis en place mon appel Synchrone de ce genre.

- (IBAction)setRequestString:(NSString *)string
{
    //Set database address
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://127.0.0.1:8778/instacodeData/"]; // imac development

    //PHP file name is being set from the parent view
    [databaseURL appendString:string];

    //call ASIHTTP delegates (Used to connect to database)
    NSURL *url = [NSURL URLWithString:databaseURL];

    //SynchronousRequest to grab the data
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSError *error;
    NSURLResponse *response;

    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (!result) {
        //Display error message here
        NSLog(@"Error");
    } else {

        //TODO: set up stuff that needs to work on the data here.
        NSString* newStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
        NSLog(@"%@", newStr);
    }
}

Je pense que ce dont j'ai besoin pour faire est de remplacer l'appel

NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

avec la version Asynchrone

sendAsynchronousRequest:queue:completionHandler:

cependant, je ne suis pas sûr de ce qu'à passer à la file d'attente ou completionHandler... des exemples/solutions serait grandement apprécié.

Partie deux: J'ai lu à propos de multi-tâches et je tiens à soutenir en faisant en sorte que mes demandes de connexion complète si il y a une interruption. J'ai suivi cet exemple

Il explique comment gagner plus de temps, si une interruption se produit, je comprends ce que sa fait.. mais pas comment l'appliquer à cet égard? si vous avez des exemples ou des tutoriels pour m'aider à comprendre comment l'appliquer, ce serait génial!

114voto

mbh Points 2423

Partie 1:

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    if ([data length] > 0 && error == nil)
        [delegate receivedData:data];
    else if ([data length] == 0 && error == nil)
        [delegate emptyReply];
    else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
        [delegate timedOut];
    else if (error != nil)
        [delegate downloadError:error];
}];

38voto

Flea Points 3308

Voici un exemple:

NSString *urlAsString = @"http://www.cnn.com";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];


[NSURLConnection
         sendAsynchronousRequest:urlRequest
         queue:[[NSOperationQueue alloc] init]
         completionHandler:^(NSURLResponse *response,
                             NSData *data,
                             NSError *error) 
        {

         if ([data length] >0 && error == nil)
         {

                        // DO YOUR WORK HERE

         }
         else if ([data length] == 0 && error == nil)
         {
             NSLog(@"Nothing was downloaded.");
         }
         else if (error != nil){
             NSLog(@"Error = %@", error);
         }

     }];

26voto

malcolmhall Points 1909

Pour la file d'attente param, essayez cette magie:

[NSOperationQueue mainQueue]

9voto

Recycled Steel Points 594

Je travaille sur un problème similaire, j'ai posté cette question et a obtenu une réponse claire ici, j'espère que ça aide à la Partie 2.

Pour la partie 1 de ce que les autres mentionnés ici sont bons, mais vous avez besoin d'ajouter une autre case (j'ai modifié une réponse ci-dessous). Il est possible que votre demande sera de retour dire une Erreur 404 (page non trouvée) dans ce cas, vous ne sera pas obtenir de l'erreur et les données seront > 0. Le 200 est une bonne réponse, vous pouvez aussi consulter les StatusCode pour 404 ou quoi que ce soit.

     [NSURLConnection
     sendAsynchronousRequest:urlRequest
     queue:[[NSOperationQueue alloc] init]
     completionHandler:^(NSURLResponse *response,
                         NSData *data,
                         NSError *error) 
    {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
     if ([data length] >0 && error == nil && [httpResponse statusCode] == 200)
     {

                    // DO YOUR WORK HERE

     }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X