iOS時間規則EKRecurrenceRule簡單使用

寫作原因:到第二家公司的時候首次看到我們的日程有這個功能,之前都沒有用到過:

時間規則選擇.gif
這是一個周期規則功能類;開始覺得很難,所以重構工程我把這個界面放到了偏后面;再加上我在簡書上沒有搜到相關的文章:
沒有類似文章.png
所以我就想著自己寫一篇,如果你們需要這個控制器或者文中提到的規則時間計算庫可以在https://git.oschina.net/liyongshi.com/EKRecurrenceRuleDemo.git 下載

類簡單預覽

- (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
)

結果當然也是對的,到現在我上面的規則選擇界面就可以做出來了

補充

因為我們工程的規則選擇界面還是比較簡單的,所以就如上面所說就可以完成需求了;當然你也可以研究一些比較復雜的規則,不過一般上面這些已經夠用了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,566評論 9 467
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,905評論 0 38
  • 下午接到群主通知,按照預先的計劃,今晚輪到我為群友朗讀《少有人走的路》部分章節。 朗讀的目的就是讓聽眾解放眼睛,很...
    雅各布666閱讀 215評論 0 0