Ausnahme mit PfubiquityPeer, die beim Hinzufügen eines persistenten Speichers mit Kerndaten & iCloud beteiligt sind

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

Frage

Wenn ich einen anhaltenden Laden mit hinzufüge mit NSPersistentStoreUbiquitousContentNameKey und NSPersistentStoreUbiquitousContentURLKey Meine Anwendung stürzt jedes zweite Mal mit Ausnahme ab. Dies geschieht während des Anrufs an addPersistentStoreWithType:configuration:URL:options:error:

Die Stapelspur sieht so aus:

*** 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)

Wenn ich das nicht hinzufüge NSPersistentStoreUbiquitousContentNameKey und NSPersistentStoreUbiquitousContentURLKey Optionen für den Laden alles funktioniert ohne Probleme. Ich bekomme diese Ausnahme nur bei jedem zweiten Anwendungsstart. Zu Testzwecken (und weil ich dachte, dass das Problem etwas mit Parallelität zu tun hat), habe ich alle Kerndatenzugriff und Bindungen aus der Hauptnib -Datei entfernt und versuchte, programmatisch in den Kerndatenstapel zuzugreifen applicationDidFinishLaunching: Methode. Im ersten Test habe ich das direkt gemacht, als ich den Selektor zweites ausführte (managedObjectContext) nach einer Verzögerung von 10 Sekunden. Beide Tests führten zu jeder zweiten Anwendungsstart zu der gleichen Ausnahme.

Das (leicht verkürzt für dieses Beispiel) managedObjectContext Methode sieht so aus:

- (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_;
}

Der relevante Teil von persistentStoreCoordinator ist:

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

Ich denke, dass die PfubiquityPeer -Klasse etwas mit den Transaktionsprotokollen von Core -Daten zu tun hat, die im Ordner Mobile Documents von iCloud aufbewahrt werden, aber ich kann die eigentliche Ursache für dieses Problem immer noch nicht finden. Jede Hilfe, wie man die Wurzel dieser Ausnahme verfolgt, wird sehr geschätzt, da ich bereits Nüsse bekomme. Besonders eine Problemumgehung oder sogar eine Lösung wäre für mich sehr hilfreich. Ich bin auch froh, wenn jemand einen Hinweis hat, wie ich diese Ausnahme zumindest aufspüren kann.

Hinweis: Ich habe auch einen Fehler eingereicht, falls dies ein API -Fehler ist (rdar: // 10892613).

War es hilfreich?

Lösung

Das Neustart von OS X hat das Problem gelöst. Das erinnert mich an eine It Crowd Running Knebel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top