동적으로 생성된 값에 따라 구역 구분

4620 단어 SwiftCoreDataiOS

개요


CoreData 내의 데이터를 가져올 때 기존 데이터를 이용하여 구역을 나누기를 원합니다.
하지만 sectionNameKeyPath에 맡기기 위해 Attribute를 늘리는 것을 낭비하고 싶지 않다.
CoreData 내의 데이터 양을 최대한 늘리지 않고 기존 데이터를 활용한 분류 방법을 소개합니다.

예제


정확한 시간 데이터에서 날짜만 추출합니다.
나는 그것을 이용한다sectionNameKeyPath.
대략적인 절차는 두 가지가 있다.
  • NSManagedObject의 하위 클래스에 동적으로 값을 가져오는 데 사용되는 베이스 극을 정의합니다.
  • 모델 정의를 수행하는 파일에서 Transient 옵션xcdatamodeld을 활성화합니다.
  • 터미널 정의

    class Tweet: NSManagedObject {
    
        @NSManaged var text: String?
        @NSManaged var tweetId: String?
        @NSManaged var createdAt: NSDate?
    
        @objc var sectionDate: String {
            let dateFormatter = DateFormatter()
            dateFormatter.locale = NSLocale(localeIdentifier: "en_US") as Locale!
            dateFormatter.dateFormat = "yyyy/MM/dd"
            return dateFormatter.string(from: self.createdAt! as Date)
        }
    
    
    기탑을 정의할 때 @objc가 필요합니다.@objc가 없으면 섹션 수는 1입니다.

    Transient 옵션 사용



    이렇게 준비하면 완성된다.
    그리고 NSFetchedResultController를 초기화할 때sectionNameKeyPathsectionDate에 건네주면 됩니다.

    자세한 설명


    터미널 정의

    createdAt에는 연월 일시 분초의 정확한 시간 정보가 포함되어 있다.
    이러다 NSFetchedResultControllersectionNameKeyPath에게 맡겨도 분류가 너무 가늘어져 실용적이지 못하다.
    모델류에서 정의된 sectionDate의 기탑은 그 중에서 createdAt에서만 연월일의 정보를 추출한다.
    이로써 전달sectionNameKeyPath에 사용할 값을 얻을 수 있다.

    효과적인 Transient 활용


    초기화NSFetchedResultController할 때sectionNameKeyPath로 전달할 수 있도록 수정xcdatamodeld.Transient를 유효하게 함으로써 데이터가 지속되지 않습니다.
    이로써 sectionDate 데이터 양은 헛되이 증가하지 않는다.
    이 페이지에서 설명한 내용을 사용하여 이러한 TableView를 사용할 수 있습니다.
    (이미지의 일부가 삭제됨)

    참고 자료


    https://stackoverflow.com/questions/44804683/nsfetchedresultscontroller-not-working-with-transient-properties
    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/KeyConcepts.html
    https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller/1622282-init

    좋은 웹페이지 즐겨찾기