Sto cercando di capire come utilizzare i blocchi su iOS. Ho letto i documenti di Apple ma, come al solito, sono vaghi e incompleti e non vengono menzionate molte informazioni essenziali. Ho anche cercato su Google senza successo. Questo è quello che sto cercando di fare come esercizio per capirlo.Cercando di capire i blocchi su iOS
Ho creato un blocco per leggere una stringa e confrontare la stringa con la lettura precedente. Se le stringhe non sono le stesse, restituire SÌ, se sono uguali, restituire NO.
Ecco come ho fatto:
ho dichiarato questo sul .h
BOOL (^differentStrings)(void);
ho dichiarato questo su .m, all'interno viewDidLoad in un viewController
__block NSString * previousString;
__block NSString * currentString;
differentStrings = ^(void){
currentString = [self getString];
NSLog(@"%@", currentString); // not printing anything on console
if (![currentString isEqualToString:previousString]) {
previousString = currentString;
return YES;
} else {
return NO;
}
};
Questo è come mi uso: Ho una discussione che fa questo:
if (differentStrings)
NSLog (@"strings are different);
Questi sono i problemi che ho:
- il blocco ritornano sempre SI (stringhe sono diverse)
- io non sono confortevoli dichiarando questo videDidLoad all'interno. Come dovrei dichiararlo, quindi posso usarlo globalmente come metodo? Dovrei metterlo come vorrei con un metodo?
- Sto chiamando un metodo "getString" all'interno del blocco. Va bene?
- Trovo strano dichiarare le variabili di blocco su .m. Come vedo, dovrei dichiarare le variabili di blocco su .h e poi usarle semplicemente su .m. Ho provato a farlo, ma ho ricevuto un errore.
- Ho impostato un punto di debug sulla prima riga del blocco ma non si ferma lì;
- La riga NSlog all'interno del blocco non stampa nulla. Il blocco non viene chiamato?
Potete aiutarmi con questo?
Penso che avresti anche bisogno di "copiare" il blocco quando si assegna ad Ivar. Altrimenti, il blocco esce dallo scope quando si esce 'viewDidLoad'. Inoltre, mentre 'previousString' deve essere una variabile' __block', 'currentString' può essere una variabile locale block. –
Assolutamente giusto. Ho aggiornato la mia risposta. –
grazie per la risposta. Ho aggiunto la parentesi quando ho chiamato il blocco e ho anche fatto un Block_copy (differentStrings) dopo averlo creato su viewDidLoad ma si blocca quando chiamo il blocco usando differentStrings() ...Ho provato a chiamare il blocco dallo stesso scope e funziona, ma quando lo chiamo da un ambito diverso, si blocca, anche con Block_copy. – SpaceDog