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
}
}
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) –
anche http : //stackoverflow.com/questions/8647462/is-there-an-advantage-to-using-blocks-over-functions-in-objective-c –