NSNotifications назвать лучшие практики - PullRequest
26 голосов
/ 21 апреля 2011

При попытке отсоединить мою модель от контроллеров представления, которые отображают извлеченные данные, когда асинхронная выборка завершается, я публикую 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" используется повсеместно. И еще много таких же, как он. Так каков наилучший способ объявить строку один раз и использовать ее везде?

Ответы [ 2 ]

54 голосов
/ 21 апреля 2011

Что касается использования константных строк в вашем проекте, есть еще один вопрос о переполнении стека: Константы в Objective C .

Что касается уведомлений об именах, Руководство по кодированию для какао предлагает следующее:

Уведомления идентифицируются глобальными объектами NSString, имена которых составляются следующим образом:

[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification

3 голосов
/ 21 апреля 2011

Это не совсем соответствует предложенному 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 (которую я пока не использую), но я считаю, что преобразование простое и может быть автоматизировано.

...