Как использовать KVO для обновления свойств - PullRequest
1 голос
/ 10 января 2012

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

В моем дизайне я мог отображать сводку непосредственно из объектов тренировки.Сколько раз я пробежал, это просто количество объектов тренировки, и я мог бы суммировать расстояние в каждой тренировке, чтобы получить общее расстояние пробега.Тем не менее, я думаю, что вторая операция является слишком дорогой, потому что мне приходится сканировать всю базу данных каждый раз, когда я хочу отобразить эти данные (это та же проблема, что и в iTunes, когда вы хотите отобразить общее количество часов музыки, которое у вас есть в вашемустройство).Я мог хранить эту информацию в свойстве каждый раз, когда приложение запускается, но я думаю, что это вызвало бы медленный запуск.Из-за этого я подумал, что у меня есть 2 объекта coredata. Сводка и тренировка:

+---------------------+                    +---------------------+
|Summary              |                    |Workout              |
+---------------------+                    +---------------------+
|totalDistance        | <--------------->> |date                 |
|totalAmountOfWorkouts|                    |distance             |
+---------------------+                    |time                 |
                                           +---------------------+ 

Теперь возникает вопрос.Как обновить сводку?

Я мог бы вручную обновить totalDistance и totalAmountOfWorkouts.Я представляю реализацию какого-то метода updateWorkout, который запускается каждый раз, когда я создаю новую тренировку.Тем не менее, я знаю, что Coredata уже имеет возможности наблюдения и может сообщить мне, когда был вставлен новый объект тренировки, и я мог бы обновить Summary: KVO.Я никогда не использовал KVO, и мне интересно, подходит ли это для использования KVO?Но как ты это делаешь?Является ли KVO лучшим подходом для решения этой проблемы, или мне лучше реализовать протокол в Workout и назначить Summary делегатом?Я смутно помню, что слышал, что шаблон KVO трудно отлаживать.

Подводя итог, я задаю следующие вопросы:

Q1: Должен ли я получить totalDistance, непосредственно сканирующую БД?
Q2: Должен ли я использовать KVO или шаблон делегата?
Q3: КакTotalDistance обновлен?

Ответы [ 2 ]

1 голос
/ 10 января 2012

Используйте самый простой доступный API.Допустим, у вас есть массив извлеченных тренировок.Затем просто выполните

float distance = [[fetchedObjects valueForKeyPath: @"@sum.distance"] floatValue]

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

0 голосов
/ 05 октября 2013

Если у вас есть много объектов Workout и вы отображаете их в виде таблицы с помощью batchSize, вместо того, чтобы перебирать их все, вы можете создать NSFetchRequest, который выполняет эти вычисления на уровне SQL, что должно значительно повысить производительность и память..

пример в следующем сообщении в блоге http://iphonedevelopment.blogspot.co.il/2010/11/nsexpression.html

...