2014-01-23 3 views
5

Данные поступают с сервера в JSON, который помещается в NSDictionary. В зависимости от типа запрашиваемых данных из этого NSDictionary будет создан новый объект класса. Пришло много данных, поэтому объект содержит ссылку на NSDictionary и извлекает значение только при обращении к определенной переменной. Что-то вроде отложенной инициализации:Lazy инициализация в iOS

- (NSString *)imgURL { 
    if (_imgURL == nil) { 
     _imgURL = [self makeObjForKey:kImageURL]; 
    } 
    return _imgURL; 
} 

Это значительно увеличивает скорость приложения, но создает другие проблемы:

  1. Если значение отсутствует в NSDictionary, остается нулевым. Затем для каждого последующего вызова этой переменной происходит поиск в NSDictionary.
  2. При копировании всего экземпляра класса (протокол NSCopying) все переменные копируются, производя преобразование всего NSDictionary.

Решения:

  1. Помещенный некоторый флаг, указывающий, что значение было проверено. Но тогда вы должны добавить дополнительные проверки
  2. только скопировать NSDictionary для экземпляра объекта, но потом придется разобрать те же переменные снова

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

+1

Я согласен с ответом Роба Напира. Убедитесь, что существует необходимость оптимизировать вызовы в NSDictionary. Попробуйте просмотреть свой код (с помощью инструментов) и посмотреть время, которое вызывает NSDictionary. Это, скорее всего, будет незначительным. – FreeNickname

ответ

3

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

Для копирования моя первая рекомендация - сделать этот объект объектом (неизменным). Инициализируйте его один раз с помощью JSON, а затем не создавайте мутаторов (это может быть то, что вы делаете уже). Тогда копирование тривиально; просто верните self. Вам не нужно делать реальную копию, потому что все копии являются взаимозаменяемыми. Одним из больших преимуществ объектов ценности является то, как дешево и легко их копировать.

Если вам порой действительно нужна изменчивая версия, следуйте шаблону NSArray/NSMutableArray. Тогда только изменчивая версия будет иметь дело с копиями (в этом случае вам нужно просто скопировать словарь, а не кешированные объекты).

+3

'Если это действительно огромный словарь, я бы не стал слишком беспокоиться», и даже тогда поиск должен быть O (1), предполагающий хороший алгоритм хэширования. Конечно нет где рядом O (n) –

+0

Спасибо! Умный/неизменный образец звучит неплохо, я попробую. На самом деле, чаще всего изменяемые объекты не нужны для меня, но некоторые из них могут быть обновлены дополнительными метаданными, которые будут загружены позже. Таким образом, в этом случае лучше создать новый расширенный объект, справившись с первоначальным (с меньшим количеством данных) и добавив к нему новые значения, или чтобы первоначальный объект изменялся и просто обновлял в нем новые переменные? – Lion

+1

Если вы сомневаетесь, идите неизменно. Подумайте, действительно ли эти дополнительные метаданные принадлежат к одному и тому же словарю (или даже к одному и тому же объекту). Всегда думайте о шаблонах HAS-A.Может ли ваш объект хранить словарь данных (неизменный) и отдельный словарь метаданных (неизменный). Должен ли быть конкретный объект для хранения данных, а другой - для хранения метаданных (а затем родителя, который их присоединяет)? Неизменность помогает подтолкнуть вас к этим шаблонам HAS-A, которые имеют свои преимущества. –

Смежные вопросы