如何在没有时间的情况下按日期排序获取请求 - Swift 3

时间:2017-06-18 14:09:50

标签: ios swift sorting

我想按日期和另一个描述符对fetchRequest进行排序:

df = df.apply(pd.to_numeric)

但是sortAmount不能使用,因为它按时间排序

 let sortDate = NSSortDescriptor(key: "returnDate", ascending: true)
 let sortAmount = NSSortDescriptor(key: "amount", ascending: true)
 fetchRequest.sortDescriptors = [sortDate, sortAmount]

我怎样才能排序,例如,只按天?

1 个答案:

答案 0 :(得分:0)

通常,您可以将NSSortDescriptor子类化为自己的排序描述符,并在您自己的排序描述符中,比较没有时间组件的日期。然后使用您自己的排序描述符而不是标准描述符来比较日期。这里有一些未经测试的代码,但它会给你一个想法:

class DaySortDescriptor: NSSortDescriptor {

    static private let calendar = NSCalendar( calendarIdentifier: .gregorian)

    override
    func compare ( _ object1: Any, to object2: Any ) -> ComparisonResult {
        // Both must be dates as we cannot sort anything else
        guard let date1 = object1 as? Date,
            let date2 = object2 as? Date,
            let calendar = DaySortDescriptor.calendar
            else { assertionFailure(); return .orderedSame }
        let comp1 = calendar.components(
            [ .year, .month, .day ], from: date1
        )
        let comp2 = calendar.components(
            [ .year, .month, .day ], from: date2
        )
        let cleanedDate1 = calendar.date(from: comp1)!
        let cleanedDate2 = calendar.date(from: comp2)!
        return super.compare(cleanedDate1, to: cleanedDate2)
    }
}

唯一的问题是,虽然这将适用于刚存储在内存中的CoreData,以及使用二进制或XML作为后备存储的CoreData,但在使用SQLite后备存储时它将无法工作。实际上,Apple甚至对此发表了评论并提出了如何做的建议:

  

原因:获取请求的确切执行方式取决于商店 - 请参阅获取对象。

     

补救措施:如果直接执行fetch,请不要使用基于Cocoa的排序运算符 - 而是在内存中对返回的数组进行排序。   如果您使用的是数组控制器,则可能需要子类化   NSArrayController,因此它不会将排序描述符传递给   数据库,但将在您的数据之后进行排序   取出。

来源:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/TroubleshootingCoreData.html