Rob*_*Rob 5 ios parse-platform parse-server
使用Parse Server,我的项目经常出现问题.首先,我调用Parse Cloud函数来填充用户的数据列表:
var dataSet: Set<MyData>?
func loadData(withParameters parameters: [String : Any]) {
PFCloud.callFunction(inBackground: "loadData", withParameters: parameters) { (success, error) in
if let objects = success as? [[String : Any]] {
let dataTable: [MyData] = objects.map({ (object) -> MyData in
let myData = MyData(dataSource: PFObject(className: "MyData",
dictionary: object))
myData.dataSource?.objectId = object["objectId"] as? String
return myData
})
if self.dataSet == nil {
self.dataSet = []
}
self.dataSet = Set(dataTable)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面提到的代码中,我必须设置objectId因为没有这个,无论我从Parse获取多少个对象,当我将数组减少到具有最后一条指令的集合时,我最终只有一个对象.
但是,虽然这有效,但当我再次调用此函数来更新用户的数据时,我收到此错误myData.dataSource?.objectId = temp["objectId"] as? String:
尝试将objectId更改为脱机存储已知的对象.
试图找到一些有关它的信息,但没有什么相关的......
谢谢你的帮助.
这并不是一个真正的答案,但对于评论来说太长了:
我理解以下内容:
您的云函数loadData返回success,它是一个字典数组,或者,可能在出现错误的情况下,返回nil。如果nil返回,您什么也不做。
如果返回一个数组,则将其称为objects。
然后将该数组映射到类型为 的元素数组MyData。
对于从云函数返回的每个元素(称为 )object,MyData都会创建一个实例,用作对象字典给定的类和属性的dataSource 新实例。
我不明白您将从云函数返回的对象的 分配给新创建的下一个语句:据我所知,必须是唯一的,并且不能(或至少不应该)分配给其他。
但你说你必须这样做,否则你最终会在结果集中得到一个元素(见下文)。
不管怎样,你现在在.
然后,您初始化,这不是必需的,因为它无论如何都会被您的最后一条语句覆盖。
该语句创建了一组数组。 PFObjectMyDataobjectIdPFObjectobjectIdsPFObjectsMyDatadataTabledataSetdataTable
现在,当您在该集合中获取单个元素时,如果您没有设置objectId数组元素的属性dataTable,则意味着该数组的所有元素都是同一个对象。这意味着你的 init 函数
MyData(dataSource: PFObject(className: "MyData",
dictionary: object))
Run Code Online (Sandbox Code Playgroud)
始终返回相同的对象,并且通过设置该对象的属性将该对象变为不同的对象objectId。这对我来说很奇怪。请检查那里发生了什么。
现在,如果您loadData再次调用更新数据,云函数可能会再次返回之前的部分或全部对象。在这种情况下,您可以将一个旧的objectId(之前已分配给PFObject映射函数中创建的对象)分配给另一个新创建的对象PFObject,这是不允许的,因此会出现错误消息。
简而言之:
如果云函数重复返回相同的对象,则不得为PFObjects它们创建不同的对象,并为它们分配相同的objectId.
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |