Упорядоченный список с основными данными

Я работаю с классом, который является одновременно NSManagedObject и Codable. Это Feed, и у него несколько Albums. Мне нужен упорядоченный список Albums, но Core Data заставляет меня использовать вместо этого Set, который не упорядочен. Я могу использовать NSOrderedSet, но это плохо работает с Codable. Как лучше всего получить упорядоченный список в Core Data. Ниже приведена модель, которую я пытаюсь заставить работать.

public class Feed: NSManagedObject, Codable {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Feed> {
        return NSFetchRequest<Feed>(entityName: "Feed")
    }

    @NSManaged public var title: String
    @NSManaged public var albums: Set<Album>
    @NSManaged public var feedContainer: FeedContainer?

    enum CodingKeys: String, CodingKey {
        case title
        case albums = "results"
        case feedContainer
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(title, forKey: .title)
        try container.encode(albums, forKey: .albums)
    }

    public required convenience init(from decoder: Decoder) throws {
        guard let contextUserInfoKey = CodingUserInfoKey.context,
            let managedObjectContext = decoder.userInfo[contextUserInfoKey] as? NSManagedObjectContext,
            let entity = NSEntityDescription.entity(forEntityName: "Feed", in: managedObjectContext) else {  fatalError("Failed to decode Subject!")  }
        self.init(entity: entity, insertInto: managedObjectContext)

        let container = try decoder.container(keyedBy: CodingKeys.self)
        title = try container.decodeIfPresent(String.self, forKey: .title) ?? ""
        albums = try container.decodeIfPresent(Set<Album>.self, forKey: .albums) ?? []
    }
}

person Vandan Patel    schedule 12.09.2018    source источник
comment
Почему вы не можете использовать NSArray? И почему NSOrderedSet плохо работает с Codable?   -  person BallpointBen    schedule 12.09.2018
comment
Я бы рекомендовал использовать собственный набор‹› и соответствующим образом сортировать элементы при отображении. Это более эффективно, чем использование упорядоченных наборов   -  person vadian    schedule 12.09.2018
comment
@vadian Я думал об этом, но в моих данных нет полей для сортировки. Это просто список альбомов, и он не содержит поля, которое давало бы нам порядок.   -  person Vandan Patel    schedule 12.09.2018


Ответы (1)


Я хочу упорядоченный список альбомов

Ваша задача — присвоить объекту "Альбом" атрибут для сортировки. Затем при выборке вы можете передать дескриптор сортировки, чтобы получить альбомы, отсортированные по этому атрибуту.

person matt    schedule 12.09.2018
comment
Я не уверен, как я могу это сделать, хотя. Как я могу создать атрибут, соответствующий порядку альбомов, поступающих из сети? - person Vandan Patel; 12.09.2018
comment
Ваш вопрос ничего не говорит о приходе из сети. Вы спросили о том, как упорядочить результаты из основных данных, и я ответил о том, как вы это делаете. Результаты основных данных не имеют естественного порядка; вы должны предоставить его с помощью атрибута. Вы можете использовать метку времени, номер индекса, что угодно. - person matt; 12.09.2018