gpt4 book ai didi

ios - CoreStore 在更新数据模型时插入数组作为关系对象

转载 作者:行者123 更新时间:2023-11-28 05:43:04 24 4
gpt4 key购买 nike

我有下一个代码来更新我的锻炼:

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)))
})

}

但正如我所见,我在执行异步 block 时插入了肌肉,但是当我执行 fetchExisting 时,没有在异步 block 中添加肌肉。

编辑:

我发现 workout.muscles 中缺少反向关系,现在我添加了它,看起来 CoreStore 正确更新了锻炼实体。

但是如果我多次调用函数,我会遇到另一个问题:

  1. 第一次通话

添加肌肉组([1, 2, 3, 4, 5]...)打印(unwrappedWorkout.muscles)[1, 2, 3, 4, 5]

  1. 第二次调用 addMuscleGroups([1, 2, 3, 4, 5, 6, 7]...)

    打印(unwrappedWorkout.muscles)[6, 7]

(为了简化示例,我使用了 1、2、3、4、5、6、7 数字),但实际上有 MusclEntity 对象

因此,作为第二次调用 addMuscleGroups 函数的结果,unwrappedWorkout.muscles 有两个肌肉对象,而不是 7 个。

我添加了短视频:

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

最佳答案

我在 CoreStore's github 回答了你的问题

这将是 NSManagedObject 关于多对多属性的一般行为。

首先,正如您所发现的,反向关系很重要。

其次,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)

关于ios - CoreStore 在更新数据模型时插入数组作为关系对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55921312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com