5

Potrzebowałem szybkiego i łatwego sposobu na uzyskanie danych z URL bez konieczności bałagania z delegates.GCD dispatch_async i NSURLConnection

Czy coś jest nie tak z następującymi?

// Use gcd 
dispatch_queue_t queue = dispatch_queue_create("com.dowork", 0); 
dispatch_queue_t main = dispatch_get_main_queue(); 

// do the long running work in bg async queue 
// within that, call to update UI on main thread. 
dispatch_async(queue, ^{ 

    // Do work in the background 
    NSData *response = [NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&serviceResponse error:&serviceError]; 

    dispatch_async(main, ^{ 

     // Update UI 
     self.data = response; 
     [self.tableView reloadData]; 


    });//end 
});//end 

myślałem czytałem gdzieś dawno temu, że przy zastosowaniu metody synchronicznej NSURLConnection w wątku tła spowoduje wycieki pamięci. Czy to prawda?

Czy są jakieś problemy z umieszczonymi tam kodami? Masz problemy z przypisaniem danych do self.data w obrębie bloku?

Odpowiedz

4

Jeśli kierowania iOS5 i później, nie NSURLConnection na sendAsynchronousRequest:queue:completionHandler:

Aby odpowiedzieć na konkretne pytanie, wygląda mi na to, response może przeciekać: Nie wiem, czy istnieje niejawna pula autorelease na GCD wątkach.

Zrobione teraz badania: wątki GCD mają własne pule autoreasu, ale nie wiadomo, kiedy zostaną wyczerpane. Prawdopodobnie chcesz połączyć dwie pierwsze instrukcje z jawną pulą autorelease.

Zobacz także Do you need to create an NSAutoreleasePool within a block in GCD?

+0

Zdaję sobie sprawę, że i przetestowali niektórych implementacjach z nim. Ale nadal jest ograniczona do tego, co muszę zrobić. Metoda pokazana powyżej jest tak miła i łatwa do uzyskania 'NSData', wszystkie inne metody asynchroniczne wydają się być dwuetapowym procesem z delegatami. Tak więc wciąż zastanawiam się nad moim pierwotnym pytaniem. –

+0

@Nic: zaktualizowałem moją odpowiedź – JeremyP

+0

Dzięki, więc uważasz, że bezpiecznie jest to zrobić w ten sposób, o ile dodam własną pulę autorelease? –