5

Volevo un modo facile e veloce per ottenere i dati da un URL senza dover scherzare con delegates.GCD dispatch_async e NSURLConnection

C'è qualcosa di sbagliato in quanto segue?

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

ho pensato Ho letto da qualche tempo fa che utilizzando il metodo sincrono NSURLConnection in un thread in background potrebbe causare perdite di memoria. È vero?

Ci sono problemi con i codici che vengono pubblicati lì? Qualche problema con l'assegnazione dei dati a self.data all'interno del blocco?

risposta

4

Se si prendono di mira iOS5 e più tardi, c'è di NSURLConnection sendAsynchronousRequest:queue:completionHandler:

Per rispondere alla tua domanda specifica, sembra a me come response potrebbe fuoriuscire: Non so se v'è una piscina autorelease implicita sui filetti GCD.

Fatto qualche ricerca ora: i thread GCD hanno i loro pool di autorelease ma non si sa quando saranno prosciugati. Probabilmente vuoi raggruppare le prime due affermazioni con un pool di autorelease esplicito.

Vedi anche Do you need to create an NSAutoreleasePool within a block in GCD?

+0

mi rendo conto che, e hanno testato alcune implementazioni con esso. Ma è ancora limitato per quello che devo fare. Il metodo che mostro sopra è così bello e facile da ottenere il 'NSData', tutti gli altri metodi asincroni sembrano essere un processo in 2 passaggi con i delegati. Quindi, continuando a chiedermi della mia domanda originale. –

+0

@Nic: aggiornato la mia risposta – JeremyP

+0

Grazie, quindi pensi che sia sicuro farlo in questo modo, purché aggiungo il mio pool di autorelease? –