【问题标题】:How can I sort an array of EKEvent by date?如何按日期对 EKEvent 数组进行排序?
【发布时间】:2014-10-18 00:55:09
【问题描述】:

我有一个存储通过谓词获取的事件的数组;我想按日期对它们进行排序。我读到我必须“在数组上调用 sortedArrayUsingSelector:,为 compareStartDateWithEvent: 方法提供选择器”,但我不知道如何准确使用它。有人可以给我一个例子吗?

这是我的数组:NSArray *events = [store eventsMatchingPredicate:predicate] 谢谢!

【问题讨论】:

    标签: objective-c eventkit


    【解决方案1】:

    一旦你有了你的数组,请考虑:

    NSArray *sortedArray = [events sortedArrayUsingComparator:^NSComparisonResult(EKEvent *event1, EKEvent *event2) {
        return [event1.startDate compare:event2.startDate];
    }];
    

    这将使用内置的 NSDate - compare 函数按开始日期对事件进行排序。

    - sortedArrayUsingComparator 方法采用 NSComparator 块,其定义为:

    typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
    

    您基本上可以将其视为一个带有两个参数的块(一个 lambda 函数),并返回一个 NSComparisonResult 成员,该成员解释了两个给定对象的顺序。对象的类型取决于您放入数组中的内容,在本例中为EKEvents。如何对它们进行排序取决于您;阅读NSComparator 了解更多信息和规则。 NSArray 将多次调用您的块,每次呈现两个项目,直到数组被排序。

    现在,幸运的是,EKEvent 公开了一个选择器,该选择器知道如何与 EKEvents 进行比较。 NSArray 有另一种方法,sortedArrayUsingSelector:,您可以使用它,只需告诉它使用 EKEvent 公开的比较选择器:

    NSArray *sortedArray = [events sortedArrayUsingSelector:@selector(compareStartDateWithEvent:)];
    

    现在NSArray 每次想要比较两个项目时都会调用- compareStartDateWithEvent:。如果这是您想要的顺序,您可以使用它。否则,使用上面的比较器方法。

    【讨论】:

    • 哇,谢谢伙计!欣赏解释!我主要是从自己和其他人的代码中学习所有这些,如果这些问题对您来说很明显,我很抱歉!
    • 我们都从某个地方开始。选择器的东西有时会有点混乱。查看Objective-C Runtime Reference,了解幕后发生的一切。
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多