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

Где лучшее место для хранения констант в приложении iOS?

Я сейчас разрабатываю приложение, которое извлекает ресурсы из API JSON.

все ресурсы имеют один и тот же базовый URL:

http://api.mysite.com/resources.json
http://api.mysite.com/other_resources.json

Я хочу сохранить строку http://api.mysite.com/, чтобы она была доступна всем моим контроллерам и моделям, удаляя некоторое дублирование при написании URL-адресов ресурсов.

Где лучшее место для этого? Файл -prefix.pch?

Любые советы, оцененные

4b9b3361

Ответ 1

Я согласен с ответом Alex Coplan с важным дополнением.

Поместите все свои константы в файл с именем "Constants.h" (или вы хотите/нет)

EDIT:

  • Когда я ответил на этот вопрос три года назад, я был на стороне #define, проверьте ниже для пересмотра.

Constants.h

#define kFilterDate @"date"
#define kFilterRadius @"radius"
#define kFilterSort @"sort"

//Global Strings
#define kDividingString @" / "

//Strings
#define kTour @"Tour"
#define kToursKey @"tours"

Но вместо того, чтобы импортировать его в любой файл, который вам нужен, импортируйте его в свой префиксный файл, чтобы все ваши заголовки автоматически импортировали его во время вашего проекта.

Project_Prefix.pch

//
// Prefix header for all source files of the project
//

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "Constants.h"
#endif

ПЕРЕСМОТР

Все, хотя вся предыдущая информация все равно будет работать, есть некоторые вещи, которые мы можем сделать, чтобы быть немного более безопасными относительно наших констант.

Создайте свои константы в файле Constants.h, используя константные переменные

//Filters
FOUNDATION_EXPORT NSString *const kFilterDate;
FOUNDATION_EXPORT NSString *const kFilterRadius;
FOUNDATION_EXPORT NSString *const kFilterSort;

//Global Strings
FOUNDATION_EXPORT NSString *const kDividingString;

//Strings
FOUNDATION_EXPORT NSString *const kTour;
FOUNDATION_EXPORT NSString *const kToursKey;

И в Constants.m

//Filters
NSString *const kFilterDate = @"date";
NSString *const kFilterRadius = @"radius";
NSString *const kFilterSort = @"sort";

//Global Strings
NSString *const kDividingString = @" / ";

//Strings
NSString *const kTour = @"Tour";
NSString *const kToursKey = @"tours";

Это все равно можно импортировать в файл префикса, как указано выше, но использовать только константы, которые действительно являются глобальными в файле. Которые часто используются во многих местах. Сбрасывание всех ваших констант в этот файл приведет к тому, что ваш код будет использовать любую константу для привязки к файлу констант. Таким образом, если вы попытаетесь повторно использовать код, файл констант должен прийти с ним. Это не всегда обязательно плохо, и много раз предназначено (что хорошо), но ограничение зависимостей всегда является хорошей идеей.

Несколько вещей о пересмотре:

  • FOUNDATION_EXPORT vs extern. Первый компилируется для C и С++. Это в основном означает extern, но в С++ добавляется флаг "C".
  • consts vs defines. consts являются безопасными по типу и уважаемым областям. defines - это полная противоположность.

Ответ 2

Лично я предпочитаю использовать фактические константные переменные, а не определять.

В файле MyConstants.m у меня есть:

NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/";
NSString *const kXYSomeOtherURL = @"http://www.google.com/";

где XY - это мои инициалы или какой-либо другой "уникальный" префикс, чтобы избежать столкновений с другими константами.

Затем у меня есть файл MyConstants.h следующим образом:

extern NSString *const kXYMySitBaseURL;
extern NSString *const kXYSomeOtherURL;

В зависимости от того, сколько файлов требуется для доступа к этим константам, я мог бы включить его в предварительно скомпилированный заголовок, как предлагает ColdFusion в его ответе.

Вот как Apple определяет свои константы в большинстве базовых фреймворков.

Ответ 3

Я просто создаю файл с именем Globals.h с чем-то вроде следующего:

#define kBaseURL @"http://api.mysite.com/"

Затем для использования:

#import "Globals.h" // at the top

NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL];

Ответ 4

Я бы создал один синглтон или использовал AppDelegate и разместил там константы.

Ответ 5

Да, глобальный заголовок будет идеальным решением. Я бы не пошел до одноэлементного шаблона, если не планировал использовать его для других вещей, таких как управление хранилищем данных. Синглтон для глобалов несколько завышен.