Подтвердить что ты не робот

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

4b9b3361

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