10

'u, Apple tarafından sağlanan yeni ve zarif bir API olduğu için şimdi bir gün NSURLConnection'dan kaçınarak kullanmaya başladım. Önceden, arka planda yürütmek için NSURLRequest aramasını GCD bloğuna koydum. İşte geçmişte yapmak için kullanılan nasıl: ArtıkHTTP veri görevi için NSURLSession (NSURLSessionDataTask) arka plan iş parçacığında çalışır mı yoksa sıraya mı ihtiyacımız var?

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

, burada ben nasıl kullanılacağı NSURLSession:

Bunu bilmek istiyorum
- (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); 
}]; 
} 

, ricam arka plan iş parçacığı kendisi ya ben idam edilecek Kendi mekanizmamı NSURLRequest durumunda yaptığım gibi sağlamanız gerekecek mi?

Lütfen bilgilerinizi paylaşın. Şimdiden teşekkürler !!!

+1

kadarıyla ben hiçbir şey bildiğimiz gibi arka planda çalışır !!: Örneğin, bu yansıtmak için sonuçların listesini almak ve UI güncelleştirmek için gittiğini düşünelim, gibi bir şey görebilirsiniz !! –

+2

@ T_77 Arka plan iş parçacığı üzerinde kod çalıştıran çok sayıda Kakao yöntemi vardır (bununla birlikte). – Rob

+1

Lütfen bana @Rob –

cevap

30

Hayır, bunu arka plan sırasına göndermek için GCD kullanmanız gerekmez. Aslında, tamamlama bloğu arka plan iş parçacığı üzerinde çalıştığı için, tam tersi doğrudur, ana blokta (ör., Model nesneleri, UI güncelleştirmeleri, vb. Için senkronize güncelleştirmeler) çalıştırmak için bu blokta herhangi bir şeye ihtiyacınız varsa, bunu ana sıraya kendiniz göndermek için. u bunu yapmak sürece

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

Teşekkürler Rob, upvoted & kabul edildi! – NSPratik

İlgili konular