Exception avec PFUbiquityPeer impliqué lors de l'ajout d'un magasin persistant avec Core Data et iCloud

StackOverflow https://stackoverflow.com/questions/9349998

Question

Quand j'ajoute un magasin persistant avec NSPersistentStoreUbiquitousContentNameKey et NSPersistentStoreUbiquitousContentURLKey mon application plante à chaque seconde fois avec une exception. Cela se produit lors de l'appel à addPersistentStoreWithType:configuration:URL:options:error:

Les regards de trace de pile comme ceci:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
  reason: 'An NSManagedObject of class 'PFUbiquityPeer' must have a valid
  NSEntityDescription.'
*** First throw call stack:
(
     0   CoreFoundation   0x00007fff8b35ffc6 __exceptionPreprocess + 198
     1   libobjc.A.dylib  0x00007fff83368d5e objc_exception_throw + 43
     2   CoreData         0x00007fff82c28c06 -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:] + 182
     3   CoreData         0x00007fff82d4d3dc +[PFUbiquityPeer(UbiquityMethods) peerForPeerID:inManagedObjectContext:createIfMissing:] + 364
     4   CoreData         0x00007fff82d4f809 -[PFUbiquityPeerRange(UbiquityMethods) loadFromStoreMetadataDictionary:] + 105
     5   CoreData         0x00007fff82d80372 -[PFUbiquityStoreMetadataMedic recoverPeerRangesWithError:] + 418
     6   CoreData         0x00007fff82d80ab5 -[PFUbiquityStoreMetadataMedic recoverMetadataWithError:] + 1749
     7   CoreData         0x00007fff82d831dc -[PFUbiquitySetupAssistant performPostStoreSetupWithStore:error:] + 732
     8   CoreData         0x00007fff82c04001 -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:] + 3537
     9   MyApp            0x000000010323de60 -[AppDelegate persistentStoreCoordinator] + 4224
     10  MyApp            0x000000010323e43f -[AppDelegate managedObjectContext] + 95
     11  Foundation       0x00007fff863b5384 _NSGetUsingKeyValueGetter + 62
     12  Foundation       0x00007fff863b5339 -[NSObject(NSKeyValueCoding) valueForKey:] + 392
     13  Foundation       0x00007fff863d4dc6 -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 348
     14  AppKit           0x00007fff87fb1ae2 -[NSBinder _valueForKeyPath:ofObject:mode:raisesForNotApplicableKeys:] + 654
     15  AppKit           0x00007fff87fb17cc -[NSBinder valueForBinding:resolveMarkersToPlaceholders:] + 171
     16  AppKit           0x00007fff87fb143a -[NSObjectParameterBinder _updateObject:observedController:observedKeyPath:context:] + 1181
     17  AppKit           0x00007fff87fa3777 -[NSObject(NSKeyValueBindingCreation) bind:toObject:withKeyPath:options:] + 591
     18  AppKit           0x00007fff87f9ca89 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1079
     19  AppKit           0x00007fff87f9309f loadNib + 322
     20  AppKit           0x00007fff87f9259c +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217
     21  AppKit           0x00007fff87f924b7 +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141
     22  AppKit           0x00007fff87f923fa +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
     23  AppKit           0x00007fff882059b3 NSApplicationMain + 398
     24  MyApp            0x0000000103239522 main + 34
     25  MyApp            0x00000001032394f4 start + 52
     26  ???              0x0000000000000003 0x0 + 3
)
terminate called throwing an exception(lldb)

Quand je ne pas ajouter les options de NSPersistentStoreUbiquitousContentNameKey et NSPersistentStoreUbiquitousContentURLKey aux œuvres de tout magasin sans problèmes. Je reçois cette exception que chaque deuxième lancement de l'application. À des fins d'essai (et parce que je pensais que la question pourrait avoir quelque chose à voir avec la concurrence), j'ai enlevé tous l'accès aux données de base et les liaisons du principal fichier NIB et essayé d'accéder à la pile de données de base dans la programmation méthode applicationDidFinishLaunching:. Dans le premier test je l'ai fait directement, la deuxième fois je fis le sélecteur (managedObjectContext) après un délai de 10 secondes. Les deux tests ont donné lieu à la même exception sur chaque deuxième lancement de l'application.

Le (légèrement raccourcies pour cet exemple) méthode de managedObjectContext ressemble à ceci:

- (NSManagedObjectContext *)managedObjectContext
{
  if (managedObjectContext_)
  {
    return managedObjectContext_;
  }

  NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
  if (!coordinator)
  {
    return nil;
  }

  NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] 
    initWithConcurrencyType:NSMainQueueConcurrencyType];
  [moc performBlockAndWait:
   ^{
    moc.mergePolicy = [[NSMergePolicy alloc] 
      initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType];
    [moc setPersistentStoreCoordinator:coordinator];

    [[NSNotificationCenter defaultCenter] addObserver:self
      selector:@selector(mergeChangesFrom_iCloud:) 
      name:NSPersistentStoreDidImportUbiquitousContentChangesNotification 
      object:coordinator];
  }];
  managedObjectContext_ = moc;

  return managedObjectContext_;
}

La partie pertinente de persistentStoreCoordinator est:

  NSMutableDictionary *storeOptions = [NSMutableDictionary dictionary];
  [storeOptions setObject:[NSNumber numberWithBool:YES] 
    forKey:NSMigratePersistentStoresAutomaticallyOption];
  [storeOptions setObject:[NSNumber numberWithBool:YES] 
    forKey:NSInferMappingModelAutomaticallyOption];

  NSURL *url = [NSURL fileURLWithPath:[applicationSupportDirectory 
    stringByAppendingPathComponent:kJCMyAppDatabaseFilename]];
  NSURL *ubiquityURL = [[NSFileManager defaultManager] 
    URLForUbiquityContainerIdentifier:nil];
  if (ubiquityURL)
  {
    JCDLog(@"User has iCloud enabled.");
    [storeOptions setObject:@"com.juicycocktail.myapp" 
      forKey:NSPersistentStoreUbiquitousContentNameKey];
    [storeOptions setObject:[NSURL fileURLWithPath:[[ubiquityURL path] 
      stringByAppendingPathComponent:kJCMyAppDatabaseFilename]] 
      forKey:NSPersistentStoreUbiquitousContentURLKey];       
  }

  persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] 
    initWithManagedObjectModel:mom];
  NSPersistentStoreCoordinator *psc = persistentStoreCoordinator_;

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
  (dispatch_block_t)^{
    [psc lock];
    if (![psc addPersistentStoreWithType:kJCMyAppStoreType
      configuration:nil URL:url options:storeOptions error:&error])
    {
      dispatch_async(dispatch_get_main_queue(),
      ^{
        [[NSApplication sharedApplication] presentError:error];
        persistentStoreCoordinator_ = nil;

        return;
      });
    }    
    [psc unlock];

    dispatch_async(dispatch_get_main_queue(),
    ^{
      JCDLog(@"asynchronously added persistent store!");
      [[NSNotificationCenter defaultCenter]
        postNotificationName:@"RefetchAllDatabaseData"
        object:self userInfo:nil];
    });
  });

  return persistentStoreCoordinator_;

Je suppose que la classe PFUbiquityPeer aurait pu quelque chose à voir avec les journaux de transactions de base de données qui sont conservés dans le dossier de documents mobiles iCloud, mais je ne peux toujours pas trouver la vraie cause de ce problème. Toute aide comment suivre la racine de cette exception est très apprécié comme je suis déjà obtenir des noix. En particulier une solution de contournement ou même une solution serait très utile pour moi. Je suis aussi heureux que si quelqu'un a un soupçon comment suivre au moins dans cette exception.

Note: J'ai aussi un bug dans déposé cas ce bug est un API (rdar: // 10892613).

Était-ce utile?

La solution

OS X résolu Redémarrage la question. Cela me rappelle un IT Crowd en cours d'exécution gag .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top