Извлеченный объект CoreData становится нулевым при попытке обновления в обработчике завершения - Swift4 - PullRequest
0 голосов
/ 28 мая 2018
        let bgContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

        let moc = appDelegate.coreData.persistentContainer.viewContext
        bgContext.parent = moc
        bgContext.perform({

            let fetchedResultController: NSFetchedResultsController<ReservationsEntity>
            let request: NSFetchRequest<ReservationsEntity> = ReservationsEntity.fetchRequest()
            let sort = NSSortDescriptor(key: #keyPath(ReservationsEntity.reservedDate), ascending: true)
            request.sortDescriptors = [sort]
            request.predicate = NSPredicate(format: "isSynced == %@", NSNumber(value: false))
            fetchedResultController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)

            do{
                try fetchedResultController.performFetch()
                for reservationEntity in fetchedResultController.fetchedObjects!{

                    print(reservationEntity.isSynced!)
                    let params = BaseViewController.getReservationDictionaryForOffline(reservation: reservationEntity)
                    ServerCalls.addReservationToServer(parametersForReservation: params, kindOfScreen: 0, completionHandler: { (response) in
                        print(reservationEntity.isSynced!)

                        reservationEntity.isSynced = true

                    })
                }

            } catch{

            }


        })

Проблема : Здравствуйте! У меня есть сценарий использования AddReservation, в котором я добавляю запись в объект CoreData с именем ReservationsEntity с атрибутом isSynced в false изначально.Я также делаю серверный вызов одновременно, и как только серверный вызов возвращается, я пытаюсь обновить флаг isSynced до true.Но после того, как сервер вернул вызов, мой объект CoreData становится нулевым.

Согласно приведенному выше коду, сначала print(reservationEntity.isSynced!) показывает false в отладчике.Когда я пытаюсь распечатать / получить доступ к reservationEntity после возврата ServerCalls.addReservationToServer, приложение завершает работу, когда объект reservationEntity становится nil.

Последние несколько дней я пытался это исправить, пытаясь разными способами, но безрезультатно.Какую ошибку я здесь делаю?

1 Ответ

0 голосов
/ 29 мая 2018

Можете ли вы попробовать этот код

let bgContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
bgContext.persistentStoreCoordinator = appDelegate.coreData.persistentContainer.persistentStoreCoordinator

И удалить

let moc = appDelegate.coreData.persistentContainer.viewContext
bgContext.parent = moc
...