CoreData fetch () возвращает неупорядоченные объекты - PullRequest
0 голосов
/ 07 июня 2018

У меня есть сущность, у которой есть имя, и для целей тестирования я назвал их в порядке наиболее недавно добавленного (0) к самому старому добавленному объекту.

При первом запуске приложения оно загружает мои сущности в порядке(0,1,2 ...), но если я изменю атрибут имени любой сущности, порядок будет испорчен.Я использую функцию tableView numberOfRows, чтобы проверить это, так как он вызывается при перезагрузке tableView (исправьте меня, если я ошибаюсь):

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return 0}
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "GraphDataSet")
    do {
        graphSetArray.removeAll()
        graphSetArray = try managedContext.fetch(fetchRequest)
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
    for i in 0..<graphSetArray.count{
        let set = graphSetArray[(graphSetArray.count-1)-i]
        print("Name: ", set.value(forKeyPath: "name") as? String)
    }
    return graphSetArray.count
}

Насколько я понимаю, это очищает массив, содержащий все объекты (хотя я полагаю, что это бессмысленно, так как он устанавливается в следующей строке, но я хотел убедиться), затем выбирает объекты, заполняющие массив.Затем я перебираю массив в обратном направлении (от недавнего к старому), получаю объект этого индекса и печатаю его атрибут name.

Это вывод консоли каждый раз, когда я запускаю приложение:

Name:  Optional("0")
Name:  Optional("1")
Name:  Optional("2")
Name:  Optional("3")
Name:  Optional("4")
Name:  Optional("5")
Name:  Optional("6")

Вот после того, как я изменил значение имени сущности на то же значение, которое было (только для поддержания его в порядке, но технически изменив значение и перезагрузив tableView):

Name:  Optional("5")
Name:  Optional("4")
Name:  Optional("1")
Name:  Optional("3")
Name:  Optional("0")
Name:  Optional("2")
Name:  Optional("6")

Не знаю, почемуэто происходит потому, что я каждый раз получаю данные одинаково, и каждый раз, когда я перезагружаю приложение, порядок возвращается к нормальному.Моя единственная теория заключается в том, что когда атрибут сущности изменяется, порядок упорядочен без какого-либо паттерна.Поэтому мне интересно, верна ли эта теория, и если да, то есть ли способ остановить изменение порядка?

РЕДАКТИРОВАТЬ: Одна вещь, которую я только что заметил, что после того, как она выходит из строя, каждый разпосле этого, когда я изменяю значение, он сохраняет этот несортированный порядок

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы уверены, что используете Array в качестве резервного хранилища?Автоматически сгенерированные версии могут на самом деле быть наборами, а не массивами.

К вашему запросу на выборку также могут быть применены дескрипторы сортировки, чтобы гарантировать, что результаты - независимо от того, как они хранятся - показываются вам в путичто вы указываете.

0 голосов
/ 07 июня 2018

Порядок не обязательно хранится в CoreData, но вы можете добавить дескриптор сортировки в запрос выборки, чтобы упорядочить его определенным образом.Если вы хотите, чтобы он был отсортирован по добавленному времени, вам нужно будет добавить временную метку к вашей модели и отсортировать по ней.

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "GraphDataSet")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...