у выбранной сущности coredata все еще есть старые данные после сохранения, но они верны на диске - PullRequest
0 голосов
/ 04 декабря 2018

Это действительно странная проблема, которую я не могу понять.У меня есть список сущностей в coredata, которые я пытаюсь обновить.

    CoreDataManager.shared.storeContainer.performBackgroundTask { (context) in

        let queueItem = QueItem.getQueWithID(context: context, id: workID!)
        //fill in properties

        let workItem = WorkItem.getWorkItemWithID(context: context, id: workID!)
        //fill in some properties
        workItem?.property1 = stuff
        workItem?.property2 = stuff2

        CoreDataManager.shared.saveContext(context)
        ConnectionQue.shared.startQueue()
    }

На данный момент все правильно.Я вижу объекты на диске с правильными значениями, используя DBBrowser для SQLLite.Если я остановлюсь и проверим сами объекты, у них также будут правильные данные.

Затем поток приложения пытается выполнить некоторые подключения, используя эти данные, и, если это не удается, он просто выполняет базовую выборку для workItems для заполненияэкран.Однако конкретный обновленный рабочий элемент не имеет изменений в выборке, которую я вызываю, чтобы получить то, что хранится локально.Однако я сделал выборку для queueItems (которые являются новыми сущностями и созданы одновременно), и они действительно существуют со своими обновлениями.Это как НОВЫЕ элементы сохраняются, но обновления нет.

Это мой код, когда я выполняю выборку в главном потоке, используя основной контекст для заполнения экрана локальным хранилищем.

    DispatchQueue.main.async {
        let request = WorkItem.fetchRequest()
        let workItems = CoreDataManager.shared.performFetch(CoreDataManager.shared.mainContext, fetchRequest: request as! NSFetchRequest<NSFetchRequestResult>) as? [WorkItem]

        completion(workItems, nil)
    }

Теперь, когда я смотрю на массив, возвращенный workItems, у сущности есть старые пустые данные, а не новые, заполненные ранее.Пункты Que верны, хотя.И если я перезапущу приложение, а затем выполню выборку, вся информация верна.

Я пытался сохранить основной контекст специально, но, похоже, это не помогло.

Что может привести к тому, что одна сущность будет неправильной в выборке, но другая сущность будет правильной в своей выборке, если они были изменены одновременно?

РЕДАКТИРОВАТЬ: Итак, я нашел решение,но не знаю, правильный ли он.Так как это казалось проблемой кеширования, и так как я знал о старом вызове target-c в refreshAllObjects (), я попытался сделать это также быстро, и, похоже, это работает.Но так ли это?Все обновления требуют обновления?Почему это не произойдет автоматически?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...