寫作原因:到第二家公司的時候首次看到我們的日程有這個功能,之前都沒有用到過:
類簡單預覽
- (instancetype)initRecurrenceWithFrequency:(EKRecurrenceFrequency)type
interval:(NSInteger)interval
daysOfTheWeek:(nullable NSArray<EKRecurrenceDayOfWeek *> *)days
daysOfTheMonth:(nullable NSArray<NSNumber *> *)monthDays
monthsOfTheYear:(nullable NSArray<NSNumber *> *)months
weeksOfTheYear:(nullable NSArray<NSNumber *> *)weeksOfTheYear
daysOfTheYear:(nullable NSArray<NSNumber *> *)daysOfTheYear
setPositions:(nullable NSArray<NSNumber *> *)setPositions
end:(nullable EKRecurrenceEnd *)end
絕大多數時候都是使用這個初始化函數,我們會按照type的不同來選擇性的填寫初始化參數;我們先來看看各參數是什么意思
type
typedef NS_ENUM(NSInteger, EKRecurrenceFrequency) {
EKRecurrenceFrequencyDaily,//按天
EKRecurrenceFrequencyWeekly,//按周
EKRecurrenceFrequencyMonthly,//按月
EKRecurrenceFrequencyYearly//按年
};
重復規則
interval
間隔單位,會根據type的不同用法也不一樣
days
EKRecurrenceDayOfWeek類型,表示星期一、星期二...星期日,可以傳入多個值
monthDays
一個月中的幾號,可以傳入多個值
months
一年中的幾月,可以傳入多個值
weeksOfTheYear
一年中的多少周,可以傳入多個值
daysOfTheYear
一年中的多少號,可以傳入多個值
setPositions
規則之外的數字,也就是除了上面的規則我還需要這些點也觸發執行
end
EKRecurrenceEnd類型,標示規則結束;有次數(如只執行10次)和時間(如該時間后不再計算)兩個選擇
下面我就講講我的規則選擇界面(文章開頭的gif圖)都填充了哪些參數來初始化;我們假設需要執行規則的時間為:2016-12-01到2016-12-31中的早上8:30到晚上6:30;下面我們以type的四種情況開始講
EKRecurrenceFrequencyDaily
當type為EKRecurrenceFrequencyDaily時,填充interval和days
一:interval為6,days為nil;也就是每6天執行一次
我們用一個庫來計算出所有的事件開始時間得到如下結果:
<__NSArrayM 0x600000455a80>(
2016-12-06 08:30:00 +0000,
2016-12-12 08:30:00 +0000,
2016-12-18 08:30:00 +0000,
2016-12-24 08:30:00 +0000,
2016-12-30 08:30:00 +0000
)
這個結果剛好就是每隔6天執行一次
二:interval為1,days為星期一...星期五;也就是每個工作日執行一次
<__NSArrayM 0x61000025e390>(
2016-12-01 08:30:00 +0000,
2016-12-02 08:30:00 +0000,
2016-12-05 08:30:00 +0000,
2016-12-06 08:30:00 +0000,
2016-12-07 08:30:00 +0000,
...
2016-12-26 08:30:00 +0000,
2016-12-27 08:30:00 +0000,
2016-12-28 08:30:00 +0000,
2016-12-29 08:30:00 +0000,
2016-12-30 08:30:00 +0000
)
EKRecurrenceFrequencyWeekly
當type為EKRecurrenceFrequencyWeekly時,填充interval和days;
一:interval為2,days為星期一和星期四;也就是我要每隔兩周的星期一和星期四執行一次
我們將會得到如下結果:
<__NSArrayM 0x60800044f660>(
2016-12-01 08:30:00 +0000,
2016-12-12 08:30:00 +0000,
2016-12-15 08:30:00 +0000,
2016-12-26 08:30:00 +0000,
2016-12-29 08:30:00 +0000
)
EKRecurrenceFrequencyMonthly
當type為EKRecurrenceFrequencyWeekly時,填充interval和monthDays;
一:interval為1,monthDays為6;也就是每一個月的6號執行一次
我們得到:
<__NSArrayM 0x610000252150>(
2016-12-06 08:30:00 +0000
)
因為我們規定的時間只有12月,所以只有一個時間
EKRecurrenceFrequencyYearly
當type為EKRecurrenceFrequencyWeekly時,填充interval、monthDays和months,其中interval設置為1
一:monthDays為8,months為12;也就是每年的12月8號執行一次
我們會得到:
<__NSArrayM 0x618000453ef0>(
2016-12-08 08:30:00 +0000
)
結果當然也是對的,到現在我上面的規則選擇界面就可以做出來了
補充
因為我們工程的規則選擇界面還是比較簡單的,所以就如上面所說就可以完成需求了;當然你也可以研究一些比較復雜的規則,不過一般上面這些已經夠用了