2012-02-12 8 views
10

Ho imparato a conoscere i blocchi in ObjC, la sintassi è chiara e semplice. Posso leggere "i blocchi sono una grande caratteristica, la sintassi è ..." quasi ovunque. Tuttavia, mi mancano i veri vantaggi del loro utilizzo.Quali sono i reali vantaggi dell'utilizzo dei blocchi in Objective-C?

Forse è una domanda stupida: ho appena iniziato con ObjC, ma quali sono i reali vantaggi dei blocchi rispetto a un approccio "tradizionale"? Qualcuno può darmi qualche spiegazione breve e chiara?

+0

possibile duplicato di [Si prega di spiegare l'utilità di Blocchi in ObjC] (http://stackoverflow.com/questions/7842276/please-explain-the-usefulness-of-blocks-in-objective-c) –

+0

anche http : //stackoverflow.com/questions/8647462/is-there-an-advantage-to-using-blocks-over-functions-in-objective-c –

risposta

27

Tutto ciò che puoi fare con i blocchi, puoi farne a meno. Ma forniscono un ottimo modo per semplificare il codice e rendere le cose più pulite. Ad esempio, supponiamo tu abbia una connessione URL e desideri attendere il risultato. Due approcci popolari sono di fornire un callback delegato o utilizzare un blocco. Userò la classe fittizia URLConnection come esempio.

URLConnection* someConnection = [[[URLConnection alloc] initWithURL:someURL] autorelease]; 
someConnection.delegate = self; 
[someConnection start]; 

Poi da qualche altra parte nella tua classe

- (void)connection:(URLConnection)connection didFinishWithData:(NSData*) 
{ 
    // Do something with the data 
} 

Al contrario, quando si utilizza un blocco, è possibile incorporare il codice che viene chiamato proprio dove si crea il collegamento.

URLConnection* someConnection = [[[URLConnection alloc] initWithURL:someURL] autorelease]; 
someConnection.successBlock = ^(NSData*)data { 
    // Do something with the data 
}; 
[someConnection start]; 

Inoltre, supponiamo che tu abbia più connessioni nella tua classe utilizzando lo stesso delegato. Ora devi distinguere tra loro nel tuo metodo delegato. Questo può diventare complicato più ne hai. E con un blocco, puoi assegnare un blocco univoco per connessione URL.

- (void)connection:(URLConnection)connection didFinishWithData:(NSData*) 
{ 
    if(connection == self.connection1) 
    { 
     // Do something with the data from connection1 
    } 
    if(connection == self.connection2) 
    { 
     // Do something with the data from connection2 
    } 
    if(connection == self.connection3) 
    { 
     // Do something with the data from connection3 
    } 
} 
+0

Grazie per l'ottima risposta! Penso di poter vedere i vantaggi ora. L'interessante è - se ho capito bene, che ci permette anche di evitare la sincronizzazione quando vengono eseguite connessioni asincrone, giusto? – vitakot

+1

woh! spiegazione semplice ... –

+0

Bella spiegazione :) – Karun

4

Definire "approccio tradizionale"?

Personalmente, è più bello vedere un blocco, come si può vedere quale sarà la risposta a un'operazione in linea e raggruppata con l'operazione stessa.

Il modo "tradizionale" di richiamata (è quello che presumo tu voglia dire), risulterà nel dover saltare da qualche altra parte nel codice per vedere come qualcosa verrà gestito e saltare indietro, piuttosto che solo leggere tutto "insieme ".

+0

Sì, per approccio tradizionale intendo le richiamate. Che cos'è la riutilizzabilità dei blocchi? Posso leggerlo può essere memorizzato in una variabile come un puntatore per funzionare. Qual è la differenza tra puntatore a blocco e puntatore alla funzione? C'è anche un salto allora ..., o è una cattiva pratica? – vitakot

2

Un vantaggio di blocchi è che possono essere utilizzati con NSOperationQueues e Grand Central Dispatch per eseguire operazioni simultanee in un modo più semplice e più efficiente rispetto all'utilizzo NSThread (a condizione che si sta utilizzando una versione abbastanza recente di iOS/OS X).

Il fatto che possano essere passati in un modo che i metodi non possono renderli una potente funzionalità di Objective-C.

+0

spiegazione molto semplice e facile da capire..Grazie ... mi farai un'esplosione dettagliata ... – Surya

Problemi correlati