2011-08-08 5 views
5

Salut :) J'ai une question de la même comme dans Working with the same NSManagedObjectContext in multiple tabs
fond:
Mon managedObjectContext (plus MOC) est initialisées dans ma classe appDelegate et passé throught à plusieurs onglets par
myViewController.managedObjectContext = self.managedObjectContext; ou dans la méthode init avec self.managedObjectContext = pContext; le flux est: la première vue est une simple liste de collections. Les collections sont récupérées avec un NSFetchedResultsController (myViewController : UITableViewController<NSFetchedResultsControllerDelegate>). En en sélectionnant un, vous naviguez plus profondément, mais vous passez toujours ce MOC.
Dans le contrôleur suivant (detailsViewController), j'indique certains éléments de cette collection avec lesquels je peux interagir (par exemple, les commutateurs).
J'ai aussi un editingObjectContext:
NSManagedObjectContext ne rafraîchit pas correctement

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

Maintenant, ma question: parce que mon point de vue doit tourner, je me sers le truc que vous avez choisi:

// 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; 

plus j'ai un bouton pour gérer ces éléments (lequel d'entre eux doit être montré et qui pas). Ce bouton recharge simplement la table avec un nouveau 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]; 
} 

La méthode pour mettre les éléments dans le contexte semble si:

// 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]; 
} 

mais après avoir sélectionné les éléments de la vue gérée et cliqué sur Enregistrer (manageItems), la vue ne les montre pas :/je dois changer l'onglet ou naviguer dans un autre contrôleur (parent ou plus profond) pour l'actualiser. ma méthode 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] 
} 

et viewWillDisapper appelle

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

// send save-command to server 
} 

Dans un earliert Verison où il n'y avait que 1 vue, il a travaillé et je n'ai pas changé beaucoup ... vraiment:/donc je don Je ne comprends pas pourquoi le MOC agit comme il le fait. La partie « manageItems » est à peu près égale, juste un niveau plus profond dans la nouvelle version (dans le DetailsView au lieu du contrôleur) ...

si quelqu'un peut me dire ce que je peux essayer (économiser toujours au serveur lorsque le commutateur entre la gestion et normal n'est pas une solution parce que le retard dans la réponse du serveur est trop élevé pour l'actualisation, donc j'ai moins pour renverser la vue.Aussi rafraîchir les vues avec self.tableView/detailView/self.containerView refresh apporte le même résultat: /).

et un deuxième problème: Je ne peux pas appeler la méthode "editObjectContext save:" après l'envoi au serveur, car il lance des erreurs et ne sauvegarde pas du tout dans la base de données locale.

Erreur dans handleChangeResponse: "L'opération n'a pas pu être terminée (erreur Cocoa 133020.)" Erreur de domaine = code NSCocoaErrorDomain = 133020 UserInfo = {0x4d8bb90 conflictList = ( « NSMergeConflict (0x5a2fac0) pour NSManagedObject (0x5a46a80) avec objectID '0x5a46420' avec oldVersion = 7 et newVersion = 8 et ancien objet snapshot = {\ n iconName = noicon; \ n [...]; \ n} et nouvelle ligne en cache = {\ n iconName = noicon; \ n [...] \ N} » )}

si vous avez des questions ou besoin de plus code (de l'ancienne version), puis demandez;)

Merci d'avance :)

+0

ok, j'ai trouvé une version qui fonctionne avec le flipview ... déjà copié le code dans le nouveau, mais toujours le même problème ...:/ '- (void) manageItems/* DetailsViewController */ { \t DetailsView * = DetailView issen? senView: actView; \t [detailView manageItems]; } ' --- ' - (void) manageItems // DetailsView { \t gestion de gestion; \t [viewController setIsManaging: gestion];/* Parent */ \t self.fetchedResultsController = nul; \t NSError * error = nil; \t [[auto] fetchedResultsController performFetch: & error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; } ' – geo

Répondre

6

Il semble que j'ai la solution! Depuis IOS 5.0, il est une nouvelle méthode pour NSManagedObjectContext:

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; 

sur http://pauloliveira.net/tech/core-data-merging-conflicts
trouvé Cet attribut au MOC haut niveau (dans mon cas dans le appDelegate) et nulle part où d'autre! efface mes problèmes de fusion;)

+0

setMergePolicy: est disponible à partir d'iOS 3.0 – rowwingman

0

J'ai trouvé la raison pour laquelle il n'a pas travaillé ... tout oublier ce que j'ai écrit ci-dessus ... le problème était dans le fetchrequest - concrètement: dans le prédicat ... dans les versions antérieures je

[NSComparisonPredicate predicateWithLeftExpression: ...] 

dans le en réalité ver sion-je utiliser

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

parce que je devais augmenter le nombre d'options et aussi édité lui-même la demande parce qu'elle a des problèmes dans le prédicat (la comparaison d'un objet complet (de la classe MOC, extrait de la base de données) avec un l'entité n'a pas fonctionné, j'ai donc géré la solution de contournement dans DetailsViewController et n'ai pas annulé mes mises à jour à cet endroit: /).
Jamais pensé à perdre autant de temps sur ce problème>. < mais bien, aussi longtemps qu'il est résolu: D

Je vais vérifier si la deuxième question (le problème d'économie) existe encore. Sinon, je vais mettre à jour mon post, sinon ce sujet n'est pas fermé:/

0

Cela peut être dû à manageobject contexte dans l'utilisation de l'objet où u'r obtenir cela. Supprimez tout NSManagebobject au moment où vous vous déconnectez ou revenez. dire fin en utilisant l'application. Cela ressemble à ceci ...

[NSManagebobjectcontext setManagedObjectsDictionary:[NSMutableDictionary dictionary]]; 
Questions connexes