2011-08-08 25 views
5

Hola :) Tengo un problema de manera similar como en Working with the same NSManagedObjectContext in multiple tabs
fondo:
Mi managedObjectContext (más MOC) se inicializa en mi clase AppDelegate y pasó throught a varias pestañas por
myViewController.managedObjectContext = self.managedObjectContext; o en el método init con self.managedObjectContext = pContext; el flujo es: la primera vista es una lista simple de colecciones. Las colecciones se obtienen con NSFetchedResultsController (myViewController : UITableViewController<NSFetchedResultsControllerDelegate>). Al seleccionar uno, navega más profundo, pero aún pasa este MOC.
En el siguiente controlador (detalles ViewController), enumero algunos elementos de esta colección con los que puedo interactuar (por ejemplo, establecer conmutadores).
también tengo una editingObjectContext:
NSManagedObjectContext no se actualiza correctamente

// DetailsViewController.m 
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init]; 
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]]; 
self.editingObjectContext = editingContext; 

Ahora mi problema: debido a mi punto de vista tiene que girar, estoy usando el truco folowing:

// DetailsViewController.m 
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ] 
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ] 

UITableView *localContainerView = [[UITableView alloc] init]; 
self.containerView = localContainerView; 
[localContainerView release]; 
//[...] 
[containerView addSubview:actuatorView]; 
self.tableView = containerView; 

más que tener un botón para gestionar este artículos (cuál de ellos se mostrará y cuál no). Este botón simplemente vuelve a cargar la tabla con un nuevo fetchResult.

// DetailsView.m 
- (void) manageItems{ 
managing = !managing; 
[viewController setIsManaging:managing]; // parent 
self.fetchedResultsController = nil; 

NSError *error = nil; 
[[self fetchedResultsController] performFetch:&error]; 

[self reloadData]; 
[self updateBarButton]; 
} 

El método para poner los artículos en el contexto se ve tan:

// DetailsViewController.m 
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// init + create predicate 
NSSet* set = [sen filteredSetUsingPredicate:predicate]; 
if([set count] > 0) 
{ 
    for(Act* act in set) 
    { 
     [editingObjectContext deleteObject:act]; 
    } 
} 
else 
{ 
    Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext]; 

    // do things 
} 
NSError *error = nil; 
[[detailView fetchedResultsController] performFetch:&error]; 

[self.containerView reloadData]; 
[detailView reloadData]; 
} 

pero después he seleccionado los elementos de la vista administrado y hecho clic en Guardar (manageItems), la vista no muestra ellas :/Tengo que cambiar la pestaña o navegar en otro controlador (principal o más profundo) para actualizarlo. mi método viewWillAppear:

// DetailsViewController.m 
- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 
DetailsView *detailView = se ? senView : actView; 
// [do uninteresting stuff] 
[detailView.fetchedResultsController performFetch:nil]; 
[self.tableView reloadData]; 
// [do uninteresting stuff] 
} 

y viewWillDisapper llamadas

- (void)saveChanges 
{ 
if(![editingObjectContext hasChanges]) 
    return; 

// send save-command to server 
} 

En una earliert Verison donde sólo había 1 vista funcionó y no han cambiado realmente mucho ...:/así que Don No entiendo por qué el MOC actúa como lo hace. La parte "manageItems" es casi igual, es solo un nivel más profundo en la nueva versión (en el DetailsView en lugar del controlador) ...

si alguien puede decirme qué puedo probar (siempre guardando en el servidor cuando cambie entre la administración y lo normal no es una solución porque el retraso en la respuesta del servidor es demasiado alto para la actualización, por lo que tengo menos para voltear la vista. También actualizo las vistas con self.tableView/detailView/self.containerView refresh trae el mismo resultado: /).

y un segundo problema: no puedo llamar al método "editingObjectContext save:" después de enviarlo al servidor, porque arroja errores y no guarda nada en la base de datos local.

error en handleChangeResponse: "La operación no pudo completarse (error de cacao 133020.)" error de dominio = Código NSCocoaErrorDomain = 133020 UserInfo = {0x4d8bb90 conflictList = ( "NSMergeConflict (0x5a2fac0) para NSManagedObject (0x5a46a80) con objectID '0x5a46420' con oldVersion = 7 y newVersion = 8 y snapshot de objeto antiguo = {\ n iconName = noicon; \ n [...]; \ n} y nueva fila en caché = {\ n iconName = noicon; \ n [...] \ N}" )}

si tiene preguntas o necesita algo más de código (es decir, de la versión anterior), entonces sólo hay que preguntar;)

gracias en la anticipación :)

+0

bien, encontré una versión que está trabajando con la vista flipview ... ya copié el código en el nuevo, pero sigue el mismo problema ...:/ '- (void) manageItems/* DetailsViewController */ { \t DetailsView * detailView = isSen? senView: actView; \t [detailView manageItems]; } ' --- ' - (void) manageItems // DetailsView { \t managing =! Managing; \t [viewController setIsManaging: managing];/* parent */ \t self.fetchedResultsController = nil; \t NSError * error = nil; \t [[self fetchedResultsController] performFetch: & error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; } ' – geo

Respuesta

6

¡Parece que tengo la solución! Desde IOS 5.0 hay un nuevo método para NSManagedObjectContext:

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; 

conocer en http://pauloliveira.net/tech/core-data-merging-conflicts
establece este atributo en el MOC de nivel superior (en mi caso en el AppDelegate) y en ninguna parte más! borra mis problemas de fusión;)

+0

setMergePolicy: está disponible en iOS 3.0 – rowwingman

0

he encontrado la razón por la que no funcionó ... olvidar todo lo que he escrito anteriormente ... el problema estaba en el fetchrequest - concretamente: en el predicado ... en las versiones anteriores utilicé

[NSComparisonPredicate predicateWithLeftExpression: ...] 

en el realmente ver sión que utilizar

NSString * predicateFormat = [NSString stringWithFormat: ...]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:predicateFormat]; 

porque tenía que ampliar el número de opciones y también corrigió la propia solicitud, ya que hizo problemas en el predicado (comparando un objeto completo (de la clase MOC, extraída de la base de datos) con una La entidad no funcionó, por lo que administré la solución en el DetailsViewController y no revertí mis actualizaciones en este lugar: /).
Nunca pensé que perder tanto tiempo en este problema>. < pero está bien, siempre y cuando se resuelva: D

Comprobaré si el segundo problema (con el problema de salvar) aún existe. De lo contrario, actualizaré mi publicación; de lo contrario, este tema no se cerrará:/

0

Esto puede deberse al contexto del objeto de administración en el uso del objeto donde se obtiene esto. Elimine todo NSManagebobject en el momento en que cierre sesión o retroceda. digamos terminar usando la aplicación. Parece lo siguiente ...

[NSManagebobjectcontext setManagedObjectsDictionary:[NSMutableDictionary dictionary]]; 
Cuestiones relacionadas