Гибкий способ передачи ссылок в Objective-C (iPhone)? - PullRequest
1 голос
/ 16 января 2010

Какой хороший способ получить ссылку на «синглтон» объекты в Objective-C? Обратите внимание, в частности, я не имею в виду шаблон синглтона, я имею в виду объекты, у которых обычно есть только один экземпляр. Это особенно относится к моделям приложений. Например, в приложении для приготовления пищи мне нужен класс (RecipeModel), который может дать мне NSArray для всех объектов «Рецепт» в моей системе.

Я бы не хотел загружать их из постоянного хранилища каждый раз - имело бы смысл загрузить их один раз и затем кэшировать их в памяти (другими словами, в переменной этого класса). Если я сделаю это, некоторым из моих классов, вероятно, понадобится способ добраться до этого экземпляра.

Какой самый гибкий способ сделать это? Вот все варианты, которые я могу придумать.

  1. Сделайте RecipeModel настоящим Singleton с помощью метода + (RecipeModel *) sharedRecipeModel
  2. Сделайте allRecipes NSArray доступным через метод класса. Каждый viewController может затем создать новую RecipeModel и получить те же (статические / глобальные) данные. + (NSArray *) allRecipes
  3. Создайте его в appDelegate и используйте sharedApplication для получения ссылки на него
  4. Убедитесь, что все в конструкторе интерфейсов, и используйте IBOutlet для передачи копии класса моему viewController

На других платформах (flex) я бы использовал платформу DependencyInjection или MVC для обработки такого рода проводки. Я читал, что target-c не «нуждается» в структуре DI, потому что у него есть категории. Я не знаю достаточно, чтобы оценить это, но категории определенно не решают эту проблему.

Ответы [ 4 ]

2 голосов
/ 16 января 2010

Перейти к 1, иметь класс наподобие RecipeProvider с методом класса allRecipes, возвращающим массив, содержащий все рецепты. В этом методе вы можете выполнять обработку загрузки / кэширования / обновления. Чтобы отслеживать данные и статус, используйте статические переменные в своем классе RecipeProvider (не поддерживающем многопотоковое исполнение) или непосредственно в функции allRecipes.

1 голос
/ 16 января 2010

Я думаю, вы слишком усложняете это.

Нет смысла создавать одноэлементный класс, когда все, что вам нужно, это просто общий объект коллекции, к которому имеют доступ все ваши другие объекты.

Лучший способ предоставить универсальный доступ к какому-либо объекту - это оставить его в делегате приложения. В случае, если вы предложили, у вас будет что-то вроде:

@interface mytAppDelegate : NSObject <UIApplicationDelegate> {
   NSMutableArray *recipies;
...

Тогда в любом месте вашего приложения вы можете позвонить:

UIApplicationDelegate *appDelegate=[[UIApplication sharedApplication] delegate];
RecipeObj *aRecipe=[appDelegate.recipes objectAtIndex:someIndexValue];

Без суеты, без суеты.

Если вы используете Базовые данные, вы можете просто оставить объект NSManagedObjectContext в делегате приложения и получить к нему прямой доступ. Core Data обладает огромной оптимизацией, которая делает его столь же быстрым, как и более примитивные методы, созданные вручную. Я бы не стал пытаться создать отдельный массив, если вы не протестируете и не обнаружите, что прямая Core Data должна замедляться. В случае, если вы дали, этого не будет.

1 голос
/ 16 января 2010

Я использую делегат приложения для хранения ссылок на экземпляры UIFont и UIColor, чтобы де-факто создать "стиль" для интерфейса пользователя. Другие контроллеры получают доступ к этим экземплярам через делегата. Это хорошее место для них, потому что делегат приложения уже, по сути, одноэлементный, и это разумное место для конкретных приложений.

Вы также можете создать RecipeModel отдельный синглтон, если считаете, что разумнее отделить его от вашего делегата приложения. Это достигнет той же цели.

1 голос
/ 16 января 2010

Я не уверен, что есть один правильный способ сделать это, конечно, все ваши варианты осуществимы. Мое личное предпочтение - создать одноэлементный объект для моего хранилища данных и добавить из него методы для доступа к «важным вещам»; в этом случае список рецептов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...