10

Ich fing an, NSURLSession zu verwenden, indem ich NSURLConnection jetzt Tage vermeide, wie es eine neue und elegante API ist, die von Apple zur Verfügung gestellt wird. Zuvor habe ich den Aufruf NSURLRequest in den Block GCD gestellt, um ihn im Hintergrund auszuführen. Hier ist, wie ich in Vergangenheit zu tun verwendet:Wird NSURLSession für HTTP-Daten-Task (NSURLSessionDataTask) im Hintergrund-Thread ausgeführt oder müssen wir die Warteschlange bereitstellen?

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 
    }); 
}); 

Nun, hier ist, wie ich 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); 
}]; 
} 

Ich will wissen, dass mein Antrag auf Hintergrund-Thread ausgeführt werden, selbst oder I muss ich meinen eigenen Mechanismus wie bei NSURLRequest bereitstellen?

Bitte teilen Sie Ihr Wissen. Danke im Voraus !!!

+1

soweit ich nichts läuft im Hintergrund wissen, wenn u es macht !! !! –

+2

@ T_77 Es gibt viele Cocoa-Methoden (einschließlich dieser), die Code auf Hintergrund-Threads ausführen. – Rob

+1

Könnten Sie mir bitte einige dieser @Rob –

Antwort

30

Nein, Sie müssen GCD nicht verwenden, um diese zur Hintergrundwarteschlange zu senden. Da der Completion-Block im Hintergrundthread ausgeführt wird, ist das genaue Gegenteil der Fall, wenn Sie in diesem Block etwas für die Ausführung in der Hauptwarteschlange benötigen (z. B. synchronisierte Updates für Modellobjekte, UI-Aktualisierungen usw.) um diese manuell in die Hauptwarteschlange zu schicken. Zum Beispiel stellen sie sich vor, dass Sie eine Liste der Ergebnisse abgerufen werden würden, und die Benutzeroberfläche zu aktualisieren, dies zu reflektieren, könnte man so etwas sehen:

- (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

Danke Rob, upvotiert & akzeptiert !!! – NSPratik