ios - Parse Unpin no elimina el objeto del almacén de datos local
parse.com (4)
Esto debería funcionar.
Aquí está uno de los muchos intentos de resolver esto.
myTrainingSessions[indexPath.row].unpinInBackgroundWithBlock{ (succ, e) -> Void in
if succ == true {
// just remove from table view etc
self.myTrainingSessions[indexPath.row].deleteEventually()
self.myTrainingSessions.removeAtIndex(indexPath.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
// Shows that my object is still in datastore!
// object should be UNPINNED - but appers in this result....
var query = PFQuery(className:TrainingSession.parseClassName())
query.whereKey(self.userType(), equalTo: PFUser.currentUser())
query.orderByDescending("createdAt")
query.fromLocalDatastore().ignoreACLs()
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if error != nil { return }
if let result = objects as? [TrainingSession] {
println("local results")
println(result)
}
}
}
}
Hago una consulta después de unpinning y el objeto todavía está allí.
Conseguí esto para trabajar pero usando el siguiente flujo de trabajo.
Cuando creo un nuevo objeto y estoy listo para guardarlo, hago los siguientes 2 pasos
newThing.saveEventually(nil)
newThing.pinInBackgroundWithBlock { (res, errn) -> Void in
// pinning is required for offline delete to work correct
if errn != nil { return }
//self.presentingViewController?.dismissViewControllerAnimated(true, completion: { () -> Void in
// dismiss modal if required...
//})
}
Dentro de mi tableview borro así
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
self.myDataSource[indexPath.row].deleteEventually()
self.myDataSource.removeAtIndex(indexPath.row)
self.myDataSource.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}
}
Proceso de captación, dentro de la misma vista de tabla.
- Consulta local - desde el almacén de datos local - esto actualiza directamente mi tableview - llamada primero
- Consulta de red: esto elimina la fijación y la fijación, actualiza el origen de datos de Tableview: una vez completado esto, vuelve a llamar a la consulta local para actualizar la tabla.
Aquí está mi consulta de red
func networkQuery() {
let nquery = theQuery()
nquery.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let temp = objects as? [YourObjectType] where error == nil {
PFObject.unpinAllInBackground(self.myDataSource, block: { (resultBool, error) -> Void in
if error != nil { return }
PFObject.pinAllInBackground(temp, block: { (resultBool, error) -> Void in
if error != nil { return }
self.localQuery()
})
})
}
}
}
He intentado romper esto creando nuevos elementos, dentro y fuera de línea, eliminando elementos dentro y fuera de línea, todo funciona. Espero que ayude, no pude encontrar ningún ejemplo en línea, así que solo póngalo a trabajar con rastro y error ... proceso doloroso, pero trabajando como un encanto ahora.
Después de realizar I + D en parse.com, me doy cuenta de que puedes desopiar objetos del almacenamiento local una vez que están almacenados en la nube. B''coz parse se usa básicamente para almacenar datos en la nube, por lo que permite que los datos no se eliminen después de almacenarlos en la nube. p.ej.
- (void)syncDataToCloud:(id)sender {
PFQuery *qry = [PFQuery queryWithClassName:@"Person"];
[qry fromLocalDatastore];
NSArray *arr = [qry findObjects];
[PFObject saveAllInBackground:arr block:^(BOOL succeeded, NSError *error) {
if (succeeded) {
DisplayAlert(@"Sync successful.");
} else {
DisplayAlert(@"Sync unsuccessful");
}
}];
[PFObject unpinAll:arr];
}
esto funciona para mi...!! :)
Me puse en contacto con el equipo de soporte técnico sobre el problema en el que no puedes desatascar un objeto que tiene un objeto referenciado, por lo que estoy compartiendo el hilo para los interesados:
https://developers.facebook.com/bugs/138298746504630/
La persona de soporte dijo que era Por diseño, pero a mi solicitud para mejorar esta especificación, me dijo que se lo diría al equipo.
Una de las razones por las que esto no funciona es porque todavía puede haber objetos en su almacén de datos local que tengan relación con el objeto que desea quitar. Para hacer esto correctamente, primero desmarque todos esos objetos y luego libere el objeto objetivo.