1

アプリのバージョン間で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>
4

1 に答える 1

2

コメントから...

rootViewControllerアプリデリゲートにアドレスを記録し、コントローラー自体のメソッド内の対応するアドレスをログに記録すると、selfどういうわけかRootViewControllerの2つの異なるインスタンス(異なるオブジェクトアドレス)があり、mocを設定しているものが使用しようとしているものではないことがわかりますfetchedResultsControllerを生成します。

于 2012-11-19T16:46:44.113 に答える