2017-03-06 15 views
1

등의 엔터티가있는 Appointment 엔터티를 가진 UITableViewController을 제공하는 NSFetchedResultsController이 있습니다.NSSortDescriptor에서 정렬하기 (오늘 전후)

내 목표는 다음과 같이 분류 약속의 목록 것입니다 : 어제 전에

  • 일 내일
  • 어제 이후
    1. 오늘
    2. 내일을

    즉 : 첫 번째 sor 오늘 전후인지, 아니면 dateTime에 있는지 확인하십시오. 먼저 (dateTime > %TODAY%)에 정렬 한 다음 dateTime 자체에 (미래 오름차순, 과거 내림차순) 정렬하십시오.

    이렇게 할 방법이 있습니까? 내 문제는 정렬 설명자에서 % TODAY %를 사용할 수 없다는 것이지만 동일한 시각적 결과를 얻는 또 다른 방법이있을 수 있습니다.

    업데이트 : 대답은 NSFetchedResultsController으로는 가능하지 않습니다. 다른 솔루션을 선택하여보기를 표시하기 전에 Appointments을 주문하고 데이터베이스에 저장 한 후 NSFetchedResultsController이 변경 사항을 적용하도록합니다.

    업데이트 2 : 수락 된 답변이 내가 원하는 것을 정확하게 수행했습니다. 내 구현 :

    let futureAppointments = appointments.filter({ $0.dateTime != nil && $0.dateTime?.compare(Date()) == .orderedDescending }) 
        .sorted(by: { $0.dateTime?.compare($1.dateTime! as Date) == .orderedAscending }) 
    
    let pastAppointments = appointments.filter({ $0.dateTime != nil && $0.dateTime?.compare(Date()) == .orderedAscending }) 
        .sorted(by: { $0.dateTime?.compare($1.dateTime! as Date) == .orderedDescending }) 
    
    let sorted = futureAppointments + pastAppointments 
    
    for (index, appointment) in sorted.enumerated() { 
        appointment.order = NSNumber(integerLiteral: index) 
    } 
    
  • 답변

    0

    유일한 아이디어입니다. 이 같은 sortdescriptor를 만들 수 있습니다 될 수있다

    NSSortDescriptor(key: "test", ascending: true) { (v1, v2) -> ComparisonResult in 
         guard let d1 = v1 as? Date else 
         { 
          return .orderedAscending 
         } 
         guard let d2 = v2 as? Date else 
         { 
         return .orderedAscending 
         } 
         if abs(d1.timeIntervalSinceNow) < abs(d2.timeIntervalSinceNow) { return .orderedAscending } 
         if abs(d1.timeIntervalSinceNow) > abs(d2.timeIntervalSinceNow) { return .orderedDescending } 
         return .orderedSame 
    } 
    

    을 나는 일이 될 것이라 생각합니다.

    +0

    fetchRequest에서 블록 기반 정렬 설명자를 사용할 수 없습니다. https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/PersistentStoreFeatures.html#//apple_ref/doc/uid/TP40001075-CH23-SW1 –

    +0

    Jon이 말했듯이, 나는 사용할 수 없다. 그,하지만 내게 또 다른 해결책을 생각하게 만들었고, 가져 오기 전에 정렬 디스크립터로 정렬했다. 이제 누군가가보기를 열 때마다 설정되는 '주문'속성을 갖게되었습니다. 결코 10 분의 1 이상의 약속이 아니므로 성능 문제는 볼 수 없습니다. 감사합니다 – Arjan

    +0

    @ Sergey FYI 당신의 대답은 내가 원하는 것을 정확하게하지 못했습니다. 직접 구현했지만 원하는 경우 대답을 업데이트 할 수 있습니다. – Arjan

    1

    사용이 fetchedResultsControllers, 하나는 오늘 이전에 생성 된 것을 제외 술어로 상승 분류, 다른 하나는 미래의 약속을 제외한 조건으로 내림차순으로 정렬.

    fetchedResultsController indexPath와 tableview의 indexPath를 변환하는 함수를 작성하거나 그 반대로 변환하십시오. indexPath의 종류를 다루는 것이 그리 어렵지는 않습니다.

    +0

    안녕하세요, Jon, 실제로 한 화면에서 변경하거나 복사하고 싶지 않은 기본 클래스 인'CoreDataTableViewController'를 가지고 있으므로 다른 해결책을 찾으러갔습니다. 함께 생각해 줘서 고마워. – Arjan