CoreStore вставляет массив как объекты отношений при обновлении модели данных - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть следующий код для обновления моей тренировки:

func addMuscleGroups(muscleGroups: [MusclEntity], toWorkout: WorkoutEntity, completion: @escaping (ResultInfo<WorkoutEntity>) -> Void) {

        CoreStore.perform(
            asynchronous: { (transaction) -> WorkoutEntity? in
                let workout = transaction.edit(toWorkout)!

                for muscle in muscleGroups {
                    let editedMuscle = transaction.edit(muscle)!
                    workout.muscles?.insert(editedMuscle)
                }

                return workout
        },

            success: { (transactionWorkout) in // here we have muscles for transactionWorkout

                guard let unwrappedTransactionWorkout = transactionWorkout else {
                    return
                }

                let workout = CoreStore.fetchExisting(unwrappedTransactionWorkout) // there are no muscles objects

                guard let unwrappedWorkout = workout else {
                    return
                }

                completion(.data(unwrappedWorkout))
        },
            failure: { (error) in
                completion(.error(StackedError.internalFetchingDataError(message: error.debugDescription)))
        })

    }

Но, как я вижу, я вставил мышцы при выполнении асинхронного блока, но затем, когда я выполняю fetchExisting, мышц не было добавлено в асинхронный блок.

РЕДАКТИРОВАНИЕ:

Как я выяснил, в workout.muscles отсутствуют обратные связи, теперь я добавил его и выглядит как корректная сущность тренировки обновления CoreStore.

Но сейчасУ меня есть другая проблема, если я вызываю функцию несколько раз:

  1. первый вызов

addMuscleGroups ([1, 2, 3, 4, 5] ...) print (unwrappedWorkout.muscles) [1, 2, 3, 4, 5]

второй вызов addMuscleGroups ([1, 2, 3, 4, 5, 6, 7] ...)

print (unwrappedWorkout.muscles) [6, 7]

(для упрощения примера я использовал цифры 1, 2, 3, 4, 5, 6, 7), но на самом деле объекты MusclEntity

, поэтому в результате второго вызоваФункция addMuscleGroups unwrappedWorkout.muscles имеет два объекта мышц вместо 7.

Я добавил короткое видео:

https://www.screencast.com/t/63cRGKpk0Q

1 Ответ

1 голос
/ 01 мая 2019

Я ответил на ваш вопрос на CoreStore's github .

Это было бы общее поведение NSManagedObject s в отношении ко многим свойствам.

Во-первых, как вы выяснили, важны обратные отношения.

Во-вторых, Set не рекомендуется для неупорядоченных @NSManaged свойств. Вместо этого рекомендуется использовать NSSet. В этом примечании отношения ко многим обрабатываются как неизменные, что означает, что вы не можете вставлять объекты непосредственно в значение NSSet. Существует два способа ввода значений.

  1. Назначение нового NSSet напрямую:
var muscles = (workout.muscles as! Set<MusclEntity>?) ?? []
muscles.insert(newMuscle)
workout.muscles = muscles as NSSet
  1. Используйте изменяемые средства доступа KVO (для вас создается прокси NSMutableSet):
workout.mutableSetValueForKey(#keyPath(WorkoutEntity.muscles)) 
    .addObject(newMuscle)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...