如何改进涉及NSDate比较的实现?

时间:2014-10-05 03:59:36

标签: ios objective-c design-patterns mbcalendarkit

我是a calendar library for iOS的作者,我正在思考如何改进它,因为很明显人们并不了解它。

现在,我有一个只包含一个方法的数据源协议,它返回要在给定日期显示的事件:

- (NSArray *)calendarView:(CKCalendarView *)calendarView eventsForDate:(NSDate *)date;

但是,我发现在图书馆可用的两年内,我得到的大部分反馈都是,"我如何在日历上显示活动?" #34;

我一直以为这很直观:

  1. 创建一些活动。该框架有一个"事件"与之合作的对象。
  2. 将您的事件按日期排序在某些数据源中,如字典或核心数据。
  3. 返回数据源中的相应事件对象。
  4. 我还能做些什么来让其他开发人员更清楚我打算如何使用它?

3 个答案:

答案 0 :(得分:6)

  1. 您的用户需要可以复制和粘贴的代码,然后进行编辑以适应她的问题。她不想阅读有关接口的内容,然后从头开始实现它。所以在您的文档中放置了CKCalendarViewDataSource的玩具实现。玩具实现需要开箱即用。您的用户应该能够将其粘贴到项目中,编译并在日历视图中查看事件。玩具可以使用硬编码的事件阵列(根据需要调用[NSDate now]以确保默认日历月显示事件)。

    我认为在README中提供一个可行的示例实现将最大限度地减轻您的支持问题。

  2. 您的用户不希望实现回调。她没有考虑等待回答问题;她想告诉你的图书馆该做什么。

    向视图添加events属性,该属性是CKCalendarEvent的数组。让用户设置eventsdataSource。如果有超过几十个事件,请注意您建议使用dataSource的文档和标题注释。如果用户同时设置两者,则引发异常。

  3. 如果您不断被问到“我如何在日历上显示活动?”,那么将该语言添加到您的文档中。您的文档中可以多余!文档适用于人类,人类需要冗余。

    您可以使用大部分标题说“如何向日历添加事件”和“如何在日历上显示事件”和“如何在日历上显示事件”,它们都可以说同样的事情(理想情况下是示例代码)或只是链接到“显示事件”部分。

  4. CKCalendarView需要数据源UITableView的文档中,在顶部附近说明。要明确!你和我认识到这种模式,但显然你的用户没有。

  5. 提供更好的数据源界面。按NSDate查找事件并不理想,因为NSDate指定的是即时时间,而不是一整天。您希望事件属于给定的日历日,但您不关心事件的时间。你是否经过了感兴趣的当天午夜?如果活动是在上午8点怎么办?更糟糕的是,如果活动是在上午12:01的第二天,夏令时从感兴趣的那天开始怎么办?并非所有日子都是86,400秒!不要让用户在NSCalendar附近捣乱;为她做。

    我更喜欢这样的消息:

    - (NSArray *)calendarView:(CKCalendarView *)calendarView
        eventsOnOrAfterDate:(NSDate *)startingDate
        beforeDate:(NSDate *)endingDate;
    

    通过startingDate感兴趣日期的午夜(or 1 AM on certain days in certain time zones)。通过第二天的午夜endingDate。请注意,您应该允许用户指定日历的时区来计算这些NSDate(但默认为[NSTimeZone systemTimeZone])。

    如果您的用户按日历日存储她的事件而不是精确的时间戳,那么也可以指定以下消息:

    - (NSArray *)calendarView:(CKCalendarView *)calendarView
        eventsForYear:(int)year month:(int)month day:(int)day;
    

答案 1 :(得分:0)

我会选择CKCalendarEvent协议:

@protocol CKCalendarEvent <NSObject>

- (NSDate *)date;
- (NSString *)title;
- (NSDictionary *)info;
- (UIColor *)color;

@end

因此用户可以使用events属性直接在数组中提供事件:

calendar.events = @[ event1, event2, ... ];

答案 2 :(得分:0)

更改CKCalendarView

的构造逻辑也许是个好主意

示例:

CKCalendarView *calendar = [[CKCalendarView alloc] initWithDataSource:self];

CKCalendarView *calendar = [[CKCalendarView alloc] initWithEventLoader:self];