2つの方法、1つは簡単なハック、もう1つは難しいが正しい:)
(1)個々のイベントを今後10年ほど(または必要な期間だけ)保存します。
良い:実装が簡単で迅速
悪い例:データベースはすぐに大きくなります。ユーザーが詳細を編集したい場合はどうしますか?すべてを一度に編集するにはどうすればよいですか?ユーザーがイベントをキャンセル/移動したい場合はどうなりますか?すべてを削除する必要があります!
(2)ある種の「イベントの再発」情報を、各イベント、つまり「毎週火曜日」とともにデータベースに保存します。
良い:繰り返し回数に関係なく、データベース内のイベントは1つだけです。ユーザーがイベントを編集/削除するのは簡単です-データベースには1行しかありません。
悪い例:より複雑なイベントオブジェクト-各イベントには、「このイベントが発生したとき」の情報のリストが必要です。非常に複雑なイベントのタイミングを難しくします-つまり、「毎月最終金曜日」の実装に時間がかかります
編集:私の個人的な選択
私はオプション(2)を選択します-実装には時間がかかりますが、オプション(1)は将来問題を引き起こすと思います。
私は次のようなデータモデルを持っているでしょう
Event has many Occurances
ここで、イベントはユーザーが説明や開始日などを使用して作成したものであり、オキュランスは「毎週金曜日」または「4日ではない」と表示されるオブジェクトの一種です。
イベントの作成の一環として、ユーザーは「13日の金曜日に1回発生する」または「毎週水曜日に発生する」と言います。その情報は、Occuranceオブジェクトの配列を作成するために使用されます。
オカレンスは、メソッドを単純に持つプロトコルであるoccursOn:ため、さまざまなタイプのオカレンスを使用できます(アプリが複雑になるにつれて、新しいタイプを追加できます)。
occursOn:Eventオブジェクトには、指定した場所のようなメソッドがありNSDate、その日に発生した場合は戻ります。これは、それぞれの発生を順番に尋ねて、それらがその日に適用されるかどうかを確認することによって行われます。
削除されたイベントを処理するには、イベントの配列の最後にオカレンスを追加して、他のイベントをオーバーライドします。つまり、「13日の金曜日ではない」ということです。
例えば :
(1)
ユーザーは、毎週金曜日に1月1日から始まる「マイイベント」というイベントを作成します。
あなたのアプリは保存します
Event
description : 'My Event',
start date : 1st Jan 2011
occurances :
WeeklyOccurance
day : Friday
WeeklyOccuranceが<Occurance>プロトコルを実装する場所
(2)
ユーザーは、2011年1月8日日曜日から始まる週のイベントを表示するように要求します
アプリは:
For each day in the week
For each event in the database
if occursOn: this day
show the event on the ui
イベント「マイイベント」の場合、occursOnを実装します。
- (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は金曜日にのみ発生することを認識しているため、金曜日には「yes」を返し、「?」を返します。他のすべての日は、UIが金曜日に「マイイベント」を表示し、他の日は表示しないようにします。
さまざまな種類のオカレンスを追加するには<Occurance>、さまざまな方法でプロトコルを実装するだけです。
(3)
ユーザーは、実際には22日を除いて毎週金曜日にすべきだと言っています
アプリは別のオカレンス、今回は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日には表示されませんが、他のすべての金曜日には表示されます。