10

Zacząłem używać NSURLSession, unikając NSURLConnection teraz dni, ponieważ jest to nowy i elegancki interfejs API firmy Apple. Poprzednio używałam wywołania NSURLRequest w bloku GCD, aby wykonać go w tle. Oto jak kiedyś zrobić w przeszłości:Czy zadanie NSURLSession dla danych HTTP (NSURLSessionDataTask) działa w wątku w tle, czy będziemy musieli podać kolejkę?

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

Teraz tutaj jest jak używam 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); 
}]; 
} 

Chcę wiedzieć, że moja prośba zostanie zawarta w dniu samego lub I wątku tła będą musiały zapewnić mój własny mechanizm w taki sam sposób jak w przypadku NSURLRequest?

Proszę podziel się swoją wiedzą. Z góry dziękuję !!!

+1

o ile nic nie wiem działa w tle, chyba u make it !! !! –

+2

@ T_77 Istnieje wiele metod kakao (w tym ten), które uruchamiają kod na wątkach w tle. – Rob

+1

Czy możesz mi powiedzieć niektóre z tych @Rob –

Odpowiedz

30

Nie, nie trzeba używać GCD, aby wysłać to do kolejki tła. W rzeczywistości, ponieważ blok ukończenia działa w tle wątku, dokładnie odwrotnie jest prawdą, że jeśli potrzebujesz czegoś w tym bloku do uruchomienia w głównej kolejce (np. Zsynchronizowane aktualizacje do obiektów modelu, aktualizacje interfejsu, itp.), Masz ręcznie wysłać tę wiadomość do głównej kolejki. Na przykład, wyobraźmy sobie, że jechaliśmy pobrać listę wyników i zaktualizować UI w celu odzwierciedlenia tego, można zobaczyć coś takiego:

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

Dzięki Rob, przegłosowano i zaakceptowano !!! – NSPratik

Powiązane problemy