アプリのバージョン間でCoreDataControllerクラスを共有しています。
コードはiPhoneバージョンでは正常に機能しますが、iPadバージョンではすぐに停止します。
RootVCから呼び出されたコードは次のとおりです。
#pragma mark - NSFetchedResultsController
- (NSFetchedResultsController *)fetchedResultsController {
NSLog(@"%s", __FUNCTION__);
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
// Create the fetch request for the entity
NSLog(@"1");
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
// Set up the fetched results controller
NSLog(@"2");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSLog(@"3");
[fetchRequest setEntity:entity];
NSLog(@"4");
// Set the batch size to a suitable number
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *titleSortDesc = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:titleSortDesc, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate,
// nil for section name key path means "no sections"
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
return _fetchedResultsController;
}
ログエントリ1が表示されます。ログエントリ2は表示されません。代わりにこのクラッシュが発生します:
2012-11-19 08:37:26.402 I'm an iPad
2012-11-19 08:37:26.400 -[CoreDataController asyncLoadPersistentStores]
2012-11-19 08:37:26.403 -[CoreDataController loadiCloudStore:]
2012-11-19 08:37:26.404 moc is <NSManagedObjectContext: 0x1e03e4f0>
2012-11-19 08:37:26.421 -[CoreDataController iCloudStoreURL]
2012-11-19 08:37:26.454 -[CoreDataController folderForUbiquityToken:]
2012-11-19 08:37:26.460 -[RootViewController viewDidLoad]
2012-11-19 08:37:26.469 RVC moc is (null)
2012-11-19 08:37:26.470 -[RootViewController fetchedResultsController]
2012-11-19 08:37:26.472 1
2012-11-19 08:37:26.474 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Person''
*** First throw call stack:
次のように、管理対象オブジェクトのコンテキストをAppDelegateからRootVCに渡します。
rootViewController.managedObjectContext = self.coreDataController.mainThreadContext;
私はこれを理解するのにいくらかの助けを使うことができました。iPhoneとOSXでの動作の違いはわかりませんが、iPadでは動作しません。同じ共有データコントローラー。
アップデート:
これらは、以下のフィリップによるコメントで提案されたログからの結果です...
RVC is <RootViewController: 0x1f88d1a0>
-[CoreDataController loadiCloudStore:]
MOC is <NSManagedObjectContext: 0x1eda3630>
-[CoreDataController iCloudStoreURL]
-[RootViewController viewDidLoad]
-[CoreDataController folderForUbiquityToken:]
-[RootViewController fetchedResultsController]
1
SELF is <RootViewController: 0x1f8859d0>