Два способа, один легкий взлом, другой более сложный, но правильный:)
(1) Сохранять каждое отдельное событие в течение следующих 10 лет или около того (или сколь угодно долго!)
Хорошо: легко и быстро реализовать
Плохо: ваш БД очень быстро увеличится.Что, если пользователь хочет редактировать детали - как вы редактируете все сразу?Что делать, если пользователь хочет отменить / переместить событие - вы должны удалить их все!
(2) Сохранять некоторую информацию о «повторении события» в базе данных для каждого события, то есть «Каждый вторник»
Хорошо: только одно событие в базе данных, независимо от того, сколько раз оно повторяется.Пользователь может легко редактировать / удалять событие - в базе данных есть только одна строка.
Плохо: более сложный объект события - у каждого события должен быть список информации «когда это событие происходит».Трудно усложняет синхронизацию событий - например, «последняя пятница каждого месяца». Реализация занимает больше времени
РЕДАКТИРОВАТЬ: Мой личный выбор
Я бы выбрал вариант (2) - это займет больше времениреализовать, но я думаю, что вариант (1) вызовет у вас проблемы в будущем.
У меня будет модель данных, такая как
Event has many Occurances
, где ваше событието, что пользователь создал с описанием, датой начала и т. д. и Occurance, является своего рода объектом, который будет говорить «каждую пятницу» или «не 4-го числа».
Как часть создания события,пользователь скажет «происходит один раз в пятницу 13-го» или «происходит каждую среду».Эта информация используется для создания массива объектов Occurance.
Occurance - это протокол, который просто имеет метод occursOn:
, поэтому вы можете иметь множество различных типов вхождения (и вы можете добавлять новые типы в качествеприложение становится более сложным).
Объект Event будет иметь метод, похожий на occursOn:
, где вы даете ему NSDate
, и он возвращается, если это произойдет в тот день.Он делает это, спрашивая каждое из его вхождений по очереди, чтобы посмотреть, относятся ли они к тому дню.
Чтобы иметь дело с удаленными событиями, просто добавьте Occurance в конец массива события, который переопределяет другие - т.е.не в пятницу 13-го '.
Например:
(1)
Пользователь создает событие под названием «Мое событие», которое начинается 1 января и происходит каждую пятницу.
Ваше приложение будет хранить
Event
description : 'My Event',
start date : 1st Jan 2011
occurances :
WeeklyOccurance
day : Friday
, где WeeklyOccurance реализует протокол <Occurance>
(2)
Пользователь просит показать события недели,начиная с воскресенья 8 января 2011 года
Приложение будет:
For each day in the week
For each event in the database
if occursOn: this day
show the event on the ui
, а для нашего события «Мое событие» оно будет реализовано на: вроде
- (BOOL)occursOn:(NSDate *)date
is this date before this event starts
if it is, return NO
set remembered = NO
for each occurance
does this occurance say 'yes','no' or '?' for this date?
if 'yes' set remembered YES
if 'no' return NO
if '?' continue the loop
return remembered
Поскольку WeeklyOccurace знает только, что это происходит по пятницам, он будет возвращать «да» по пятницам и «?»во все остальные дни пользователь отображал «Мое событие» в пятницу, а не в другие дни.
Чтобы добавить разные типы событий, просто реализуйте протокол <Occurance>
по-разному.
(3)
Пользователь говорит, что на самом деле он должен быть каждую пятницу, кроме 22-го
Приложение создаст еще одно Occurance, на этот раз NotOnThisDayOccurance и добавит его в конецМассив события, т. Е.
Event
description : 'My Event',
start date : 1st Jan 2011
occurances :
WeeklyOccurance
day : Friday
NotOnThisDayOccurance
day: 22nd Jan 2011
Теперь, если пользователи попросят отобразить еженедельные события, «Мое событие» будет выглядеть так:
Ask the WeeklyOccurance if it's valid for friday the 22nd - this would return yes.
Ask the NotOnThisDayOccurance if it's valid for friday the 22nd - this would override the previous result and say NO
Следовательно, событие не будет отображаться22-го числа, но он появится во все остальные пятницы.