objective c - NSNotifications nombran las mejores prácticas
objective-c c-preprocessor (2)
En cuanto al uso de cadenas constantes en su proyecto, hay otra pregunta sobre el Desbordamiento de pila al respecto: Constantes en Objective C.
En cuanto a las notificaciones de nombres, las Pautas de codificación para el cacao sugieren lo siguiente:
Las notificaciones son identificadas por objetos NSString globales cuyos nombres se componen de esta manera:
[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification
Al tratar de desasociar mi modelo de los controladores de vista que muestran datos recuperados, cuando se completa una búsqueda asíncrona, publico una notificación NS.
[[NSNotificationCenter defaultCenter] postNotificationName:@"foobarFetchSuccess" object: foo];
Me he acostumbrado a usar:
#define FOO_FETCH_SUCCESS @"foobarFetchSuccess"
en un archivo de encabezado común y luego usarlo para addObserver: y removeObserver: así como postNotificationName:
[[NSNotificationCenter defaultCenter] addObserver:self @selector(gotData)
name:FOO_FETCH_SUCCESS object: baz];
Entonces, la cadena @ "foobarFetchSuccess" se usa en todo el lugar. Y hay muchos más como él. Entonces, ¿cuál es la mejor manera de declarar una cadena una vez y usarla en todas partes?
Esto no sigue exactamente el formato sugerido por Apple, ni responde directamente a su pregunta, pero pensé que compartiría estas macros de texto útiles que utilizo para ahorrarme un poco de escritura al realizar notificaciones y nombres de teclas. Puede asignarles un método abreviado de teclado, escribir y seleccionar el segmento [Did|Will] + [UniquePartOfName]
, luego presionar el método abreviado para producir la variable y su valor. También podría usar $(FILENAMEASIDENTIFIER)
lugar de $(PROJECTNAME)
si estuviera definiendo estas cadenas en el encabezado de una clase en particular, y eso se ajustaría a la sugerencia.
//MARK: Notification strings
{ /*
* Use the selection to make the name and string for a Notification.
* The string has a prefix placeholder, defaulting to the project name.
*/
Identifier = objc.notestring;
BasedOn = objc;
IsMenuItem = YES;
Name = "Notification Name From Selection";
TextString = "<#$(PROJECTNAME)#><#!notename!#>Notification = @/"<#$(PROJECTNAME)#><#!notename!#>Notification/";";
CompletionPrefix = notestring;
},
{ /*
* Insert placeholders to make the name and string for a Notification.
* This is for use without a selection, and so "only" activates at the
* beginning of the line.
*/
Identifier = objc.notestring.bol;
BasedOn = objc.notestring;
IsMenuItem = YES;
Name = "Notification Name From Selection";
OnlyAtBOL = YES;
CompletionPrefix = notestring;
},
//MARK: Default Key strings
{ /*
* Convert the selection into a name and string for use in the User
* Defaults system. The string has a placeholder for a prefix, which
* defaults to the project name.
*/
Identifier = objc.defaultskeystring;
BasedOn = objc;
IsMenuItem = YES;
Name = "UserDefaults Key From Selection";
OnlyAtBOL = NO;
TextString = "<#$(PROJECTNAME)#><#!keyname!#>Key = @/"<#$(PROJECTNAME)#><#!keyname!#>Key/";";
CompletionPrefix = defaultskey;
},
{ /*
* Insert placeholders to make the name and string for a a key for the
* User Defaults system. This is for use without a selection, and so
* "only" activates at the beginning of the line.
*/
Identifier = objc.defaultskeystring.bol;
BasedOn = objc.defaultskeystring;
IsMenuItem = YES;
OnlyAtBOL = YES;
Name = "UserDefaults Key From Selection";
CompletionPrefix = defaultskey;
},
Estas son las macros de Xcode 3. Sé que el sistema de macros es diferente en Xcode 4 (que todavía no estoy usando), pero creo que la conversión es simple y se puede automatizar.