tarjeta - ParseError de iOS: Intento cambiar un Id de objeto por uno que ya conoce la Tienda fuera de lĂnea
en este momento no puedes cambiar la informacion de la tienda de tu cuenta (2)
Tengo un problema regular con mi proyecto, el uso de Parse Server. En primer lugar, llamo a una función de Parse Cloud para rellenar la lista de datos de un usuario:
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)
}
}
}
En el código mencionado anteriormente, tengo que establecer el objectId
porque sin esto, no importa cuántos objetos obtenga de Parse, cuando reduzco la matriz a un conjunto con la última instrucción, termino con un solo objeto en ella.
Sin embargo, aunque esto funciona, cuando vuelvo a llamar a esta función para actualizar los datos del usuario, myData.dataSource?.objectId = temp["objectId"] as? String
este error en myData.dataSource?.objectId = temp["objectId"] as? String
Línea de myData.dataSource?.objectId = temp["objectId"] as? String
:
Intento cambiar un objectId por uno que ya conoce la tienda sin conexión.
Intenté encontrar información al respecto pero nada muy relevante ...
Gracias por tu ayuda.
Esta no es realmente una respuesta, pero es demasiado tiempo para un comentario:
Entiendo lo siguiente:
Su función de nube loadData
devuelve success
, que es una matriz de diccionarios o, probablemente en caso de error, nil
. Si se devuelve nil
, no haces nada.
Si se devuelve una matriz, se la denomina objects
.
Esta matriz se asigna a una matriz de elementos de tipo MyData
.
Para cada elemento devuelto por la función en la nube, llamado object
, se MyData
una instancia MyData
utilizando como dataSource
una nueva instancia PFObject
de la clase MyData
y propiedades proporcionadas por el diccionario del objeto.
No entiendo la siguiente afirmación por la que asigna el objectId
de objeto del objeto devuelto por la función de nube al PFObject
recién creado: Hasta donde yo sé, objectIds
debe ser único y no puede (o al menos no debería) asignarse a otros PFObjects
.
Pero dijiste que tienes que hacer esto o terminaste con un solo elemento en el conjunto resultante (mira a continuación).
De todos modos, ahora tiene una matriz de instancias dataTable
en dataTable
.
Luego, inicializa dataSet
, que no es necesario, ya que de todos modos se sobrescribirá en su última declaración.
Esta declaración hace un conjunto de la matriz de dataTable
.
Ahora, cuando obtiene un elemento único en este conjunto en caso de que no establezca la propiedad objectId
de los elementos de la matriz dataTable
, esto significa que todos los elementos de esta matriz son el mismo objeto. Y esto significa que su función init
MyData(dataSource: PFObject(className: "MyData",
dictionary: object))
devuelve siempre el mismo objeto, y este objeto se convierte en uno diferente estableciendo su propiedad objectId
. Esto es muy extraño para mi Por favor revisa lo que está pasando allí.
Ahora, si llama a loadData
una vez más para actualizar los datos, la función de nube probablemente devuelva algunos o todos los objetos anteriores nuevamente. En este caso, asignaría un antiguo objectId
. De objectId
, que ya ha sido asignado anteriormente a un PFObject
creado en la función de mapa, a otro PFObject
creado PFObject
allí, que no está permitido, por lo tanto el mensaje de error.
Para abreviar:
Si el mismo objeto se devuelve de la función de nube repetidamente, no debe crear diferentes PFObjects
para ellos y asignarles el mismo objectId
.
¡Espero que esto ayude!
http://parseplatform.org/Parse-SDK-iOS-OSX/api/Protocols/PFSubclassing.html
Si una subclase de PFObject cumple con PFSubclassing y llama a PFObject. + RegisterSubclass, Parse framework podrá usar esa clase como clase nativa para un objeto de nube Parse.
Por ejemplo:
1.Cree su subclase de PFObject
import Parse
class Question: PFObject, PFSubclassing {
@NSManaged var category: String?
@NSManaged var text: String
@NSManaged var image: PFFile?
@NSManaged var answerType: String
@NSManaged var order: NSNumber
static func parseClassName() -> String {
return "Question"
}
}
class User: PFUser {
@NSManaged var fullname: String
}
2.Registrar la subclase
extension Parse {
class func registerSubclasses() {
User.registerSubclass()
Question.registerSubclass()
}
}
3. Configurar el servicio de análisis una vez que se inicie la aplicación
Parse.registerSubclasses()
Parse.enableLocalDatastore()
Parse.setApplicationId(PARSE_APP_ID, clientKey: PARSE_APP_KEY)
4. Ahora PFUser == User
, Question == PFObject(className: "Question")
5. Funciona para Cloud Function
PFCloud.callFunctionInBackground("fetchQuestions", withParameters: parameters) { questions, error in
if let questions = questions as? [Question] {
completion?(questions, nil)
} else {
completion?(nil, error)
}
}
Nota: el código rápido puede ser anterior, debe haber algunos cambios si se usa una versión rápida más rápida.