Наилучшая практика использования NSNotifications
При попытке отключить мою модель от контроллеров представлений, которые отображают извлеченные данные, когда асинхронная выборка завершается, я отправляю NSNotification.
[[NSNotificationCenter defaultCenter] postNotificationName:@"foobarFetchSuccess" object: foo];
Я привык использовать:
#define FOO_FETCH_SUCCESS @"foobarFetchSuccess"
в общем заголовочном файле, а затем используя его для addObserver: и removeObserver: а также postNotificationName:
[[NSNotificationCenter defaultCenter] addObserver:self @selector(gotData)
name:FOO_FETCH_SUCCESS object: baz];
Итак, строка @foobarFetchSuccess используется повсюду. И есть еще много таких, как он.
Итак, что лучший способ объявить строку один раз и использовать ее повсюду?
Ответы
Ответ 1
Что касается использования постоянных строк в вашем проекте, возникает еще один вопрос о переполнении стека: Константы в Objective C.
Что касается уведомлений об именах, Рекомендации по кодированию для Cocoa предлагает следующее:
Уведомления идентифицируются глобальными объектами NSString, имена которых составлены следующим образом:
[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification
Ответ 2
Это не соответствует точно предложенному Apple формату и не отвечает на ваш вопрос напрямую, но я думал, что поделюсь этими макросами с удобными текстовыми текстами, которые я использую, чтобы немного помалкивать при создании уведомлений и ключах имена. Вы можете назначить им сочетание клавиш, введите и выберите сегмент [Did|Will] + [UniquePartOfName]
, затем нажмите ярлык, чтобы создать переменную и ее значение. Вы также можете использовать $(FILENAMEASIDENTIFIER)
вместо $(PROJECTNAME)
, если бы вы определяли эти строки в заголовке определенного класса, и это соответствовало бы предложению.
//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;
},
Это макросы Xcode 3. Я знаю, что макросистема отличается в Xcode 4 (которую я еще не использую), но я считаю, что преобразование простое и может быть автоматизировано.