objective-c c-preprocessor nsnotification

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.