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

Mos*_*she 2 design-patterns objective-c ios mbcalendarkit

我是iOS日历库的作者,我正在思考如何改进它,因为很明显人们并没有理解它.

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

- (NSArray *)calendarView:(CKCalendarView *)calendarView eventsForDate:(NSDate *)date;
Run Code Online (Sandbox Code Playgroud)

但是,我发现在图书馆可用的两年内,我得到的大部分反馈都是"我怎样才能让活动出现在日历上?"

我一直以为这很直观:

  1. 创建一些事件.框架有一个"事件"对象可供使用.
  2. 将您的事件按日期排序在某些数据源中,如字典或核心数据.
  3. 返回数据源中的相应事件对象.

我还能做些什么来让其他开发人员更清楚我打算如何使用它?

rob*_*off 6

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

    我认为在README中提供一个工作示例实现将最大程度地减轻您的支持难题.

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

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

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

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

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

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

    我更喜欢这样的消息:

    - (NSArray *)calendarView:(CKCalendarView *)calendarView
        eventsOnOrAfterDate:(NSDate *)startingDate
        beforeDate:(NSDate *)endingDate;
    
    Run Code Online (Sandbox Code Playgroud)

    通过感兴趣的日期的午夜(或某些时区某些日子的凌晨1点)startingDate.通过第二天的午夜endingDate.请注意,您应该允许用户指定日历的时区来计算这些NSDates(但默认为[NSTimeZone systemTimeZone]).

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

    - (NSArray *)calendarView:(CKCalendarView *)calendarView
        eventsForYear:(int)year month:(int)month day:(int)day;
    
    Run Code Online (Sandbox Code Playgroud)