Чтение plist много раз против создания объекта и чтения plist только один раз для доступа к данным в plist - PullRequest
4 голосов
/ 08 июля 2011

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

Я хотел бы знать, что дороже: многократное чтение plist (например, 50 раз)) или создание объекта, или просто что лучше.

Спасибо за вашу помощь заранее.

1 Ответ

7 голосов
/ 08 июля 2011

Это один из классических компромиссов в программировании - скорость по сравнению с использованием памяти.Техника чтения чего-то один раз и сохранения его на более быстром носителе (в этом примере в памяти) называется кешированием.Это очень популярно и не зря.Запоминающие устройства все еще на несколько медленнее, чем ОЗУ, а доступ к сети на несколько медленнее, чем на локальное запоминающее устройство.

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

ПРИМЕЧАНИЕ. Этот подход был бы вреден для очень, очень больших файлов.Если вас беспокоит использование памяти, реализуйте метод - (void)didReceiveMemoryWarning в ваших viewControllers и очищайте кэш (удаляйте его), когда у вас мало памяти.

Метод получения может выглядеть следующим образом:

- (NSArray *)data
{
    if (!cacheArray) {
        //what we do now is called "lazy initialization": we initialize our array only when we first need the data.
        //This is elegant, because it ensures the data will always be there when you ask for it,
        //but we don't need to initialize for data that might never be needed, and we automatically re-fill the array in case it has been deleted (for instance because of low memory)
        cacheArray = ... //read array from plist here; be sure to retain or copy it
    }
    return cacheArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...