10

J'ai commencé à utiliser NSURLSession en évitant NSURLConnection maintenant quelques jours car il s'agit d'une API nouvelle et élégante fournie par Apple. Auparavant, j'avais l'habitude de mettre l'appel NSURLRequest dans le bloc GCD pour l'exécuter en arrière-plan. Voici comment je l'habitude de faire dans le passé:Est-ce que NSURLSession pour la tâche de données HTTP (NSURLSessionDataTask) s'exécute dans le thread d'arrière-plan ou nous devons fournir la file d'attente?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    NSURLRequest *request = [NSURLRequest requestWithURL: 
          [NSURL URLWithString:@"www.stackoverflow.com"]]; 
    NSURLResponse *response; 
    NSError *error; 
    NSData *data = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&response 
                error:&error]; 
    if (error) { 
     // handle error 
     return; 
    } 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do something with the data 
    }); 
}); 

Maintenant, voici comment j'utilise NSURLSession:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    /*-----------------* 
     NSURLSession 
    *-----------------*/ 

    NSURLSession *session = [NSURLSession sharedSession]; 

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL: 
            [NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] 
            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
{ 
    NSDictionary *json = [NSJSONSerialization 
          JSONObjectWithData:data options:0 error:nil]; 
    NSLog(@"%@", json); 
}]; 
} 

Je veux savoir que, Ma demande sera exécutée sur un fil d'arrière-plan lui-même ou je devra fournir mon propre mécanisme de la même façon que je l'ai fait dans le cas de NSURLRequest?

Veuillez partager vos connaissances. Merci d'avance !!!

+1

pour autant que je ne sais rien fonctionne sur fond sauf si u le rendre !! !! –

+2

@ T_77 Il existe de nombreuses méthodes Cocoa (y compris celle-ci) qui exécutent du code sur les threads d'arrière-plan. – Rob

+1

Pourriez-vous s'il vous plaît me dire certains de ces @Rob –

Répondre

30

Non, vous n'avez pas besoin d'utiliser GCD pour l'envoyer à la file d'attente en arrière-plan. En fait, comme le bloc d'exécution s'exécute sur un thread d'arrière-plan, l'inverse est vrai: si vous avez besoin de quelque chose dans ce bloc pour s'exécuter dans la file d'attente principale (par ex. pour l'envoyer manuellement à la file d'attente principale. Par exemple, imaginons que vous alliez récupérer une liste des résultats et mettre à jour l'interface utilisateur pour refléter cela, vous pouvez voir quelque chose comme:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSURLSession *session = [NSURLSession sharedSession]; 

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     // this runs on background thread 

     NSError *error; 
     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 

     // detect and handle errors here 

     // otherwise proceed with updating model and UI 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.searchResults = json[@"results"]; // update model objects on main thread 
      [self.tableView reloadData];    // also update UI on main thread 
     }); 

     NSLog(@"%@", json); 
    }]; 

    [dataTask resume]; 
} 
+0

Merci Rob, mis à jour et accepté !!! – NSPratik