使用 Combine 如何遍历字典数组并设置 1 个额外的 属性?
With Combine how to iterate through an array of dictionaries and set 1 additional property?
在 a simple test project at Github 我正在下载 JSON 文件,将其解析为 [[String:Any]]
然后想将数据结构传递给 Core Data 的 NSBatchInsertRequest
:
func fetchTopModels(language:String) {
guard let url = urls[language] as? URL else { return }
URLSession.shared.dataTaskPublisher(for: url)
.tryMap(handleOutput)
.tryMap { jsonData -> [[String: Any]] in
let json = try? JSONSerialization.jsonObject(with: jsonData, options: [])
guard let jsonDict = json as? [String:Any],
let dataList = jsonDict["data"] as? [[String:Any]]
else { throw URLError(.badServerResponse) }
return dataList
}
// TODO How to set language on each dataList member?
//.map {
//[=11=].language = language
//}
.sink { completion in
print("fetchTopModels completion=\(completion)")
} receiveValue: { fetchedTops in
PersistenceController.shared.container.performBackgroundTask { backgroundContext in
backgroundContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
backgroundContext.automaticallyMergesChangesFromParent = true
backgroundContext.perform {
let batchInsert = NSBatchInsertRequest(entity: TopEntity.entity(), objects: fetchedTops)
但是 [[String:Any]]
数据结构在其每个成员上都缺少 language
字符串 属性。它在核心数据实体上是强制性的。
我的问题是如何遍历数组并在每个成员上设置 language
(例如 "en"
的值)?
我已经搜索过了,但是很难找到好的指针,因为搜索关键字太常见了:-)
要更新字典,您需要为每个字典创建一个可变副本并插入语言以及数组本身的副本。像这样
.map { array in
array.map { dict -> [String: Any] in
var temp = dict
temp["language"] = language
return temp
}
}
在 a simple test project at Github 我正在下载 JSON 文件,将其解析为 [[String:Any]]
然后想将数据结构传递给 Core Data 的 NSBatchInsertRequest
:
func fetchTopModels(language:String) {
guard let url = urls[language] as? URL else { return }
URLSession.shared.dataTaskPublisher(for: url)
.tryMap(handleOutput)
.tryMap { jsonData -> [[String: Any]] in
let json = try? JSONSerialization.jsonObject(with: jsonData, options: [])
guard let jsonDict = json as? [String:Any],
let dataList = jsonDict["data"] as? [[String:Any]]
else { throw URLError(.badServerResponse) }
return dataList
}
// TODO How to set language on each dataList member?
//.map {
//[=11=].language = language
//}
.sink { completion in
print("fetchTopModels completion=\(completion)")
} receiveValue: { fetchedTops in
PersistenceController.shared.container.performBackgroundTask { backgroundContext in
backgroundContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
backgroundContext.automaticallyMergesChangesFromParent = true
backgroundContext.perform {
let batchInsert = NSBatchInsertRequest(entity: TopEntity.entity(), objects: fetchedTops)
但是 [[String:Any]]
数据结构在其每个成员上都缺少 language
字符串 属性。它在核心数据实体上是强制性的。
我的问题是如何遍历数组并在每个成员上设置 language
(例如 "en"
的值)?
我已经搜索过了,但是很难找到好的指针,因为搜索关键字太常见了:-)
要更新字典,您需要为每个字典创建一个可变副本并插入语言以及数组本身的副本。像这样
.map { array in
array.map { dict -> [String: Any] in
var temp = dict
temp["language"] = language
return temp
}
}