2

AFIncrementalStore を MagicalRecord と一緒に使用しようとしています。

プロパティがほとんどないビールクラスがあります(BreweryDB Webサービスから)。ビールをフェッチするために、[Beer MR_fetchAllWithDelegate:self] を使用しています。これは、NSFetchedResultsController インスタンス (これを取得して、beerFetchController に割り当てます) を返し、そのコントローラーを使用して実際のフェッチを実行します。ご覧のとおり、ビュー コントローラーをメソッドのデリゲートとして設定すると、そのビュー コントローラーが beerFetchController のデリゲートとして設定されます。ここまでは順調ですね。ビールを表示するテーブル ビューがあり、メソッドを実装します。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.beersTable reloadData];
}

したがって、 AFIncrementalStore がデータを取得してコンテキストに入れるたびに、コントローラーに通知され、このメソッドを呼び出す必要があり、テーブルが更新されます。問題は、このデリゲート メソッドがまったく呼び出されないことです。いくつかの調査の後、私はいくつかの結論を引き出すことができました。

+ (NSFetchedResultsController *) MR_fetchAllWithDelegate:(id<NSFetchedResultsControllerDelegate>)delegate;
{
    return [self MR_fetchAllWithDelegate:delegate inContext:[NSManagedObjectContext MR_contextForCurrentThread]];
}


+ (NSFetchedResultsController *) MR_fetchAllWithDelegate:(id<NSFetchedResultsControllerDelegate>)delegate inContext:(NSManagedObjectContext *)context;
{
    NSFetchRequest *request = [self MR_requestAllInContext:context];
    NSFetchedResultsController *controller = [self MR_fetchController:request delegate:delegate useFileCache:NO groupedBy:nil inContext:context];

    [self MR_performFetch:controller];
    return controller;
}

問題は、[NSManagedObjectContext MR_contextForCurrentThread] が、AFIncrementalStore が内部的に使用するバッキング コンテキストである子コンテキストを返すことです。AFIncrementalStore は子ではなく親に保存するため、コントローラーは何かが変更されたことを認識せず、デリゲート メソッドは呼び出されません。私はこのようにメソッドを変更することができました:

+ (NSFetchedResultsController *) MR_fetchAllWithDelegate:(id<NSFetchedResultsControllerDelegate>)delegate inContext:(NSManagedObjectContext *)context;
{
    NSFetchRequest *request = [self MR_requestAllInContext:context];
    NSFetchedResultsController *controller = [self MR_fetchController:request delegate:delegate useFileCache:NO groupedBy:nil inContext:context.parentContext];

    [self MR_performFetch:controller];
    return controller;
}

コントローラーを MR_contextFromCurrentThread によって返されるコンテキストにバインドする代わりに、その親にバインドします。そして、期待どおりに機能し、コンテキストが変更され、コントローラーがそれを認識し、デリゲート メソッドが呼び出されます。問題は、メソッドの実装を変更する必要がないように、変更を親コンテキストから子コンテキストにプッシュする方法はありますか?

+ (NSManagedObjectContext *) MR_contextForCurrentThread;
{
    if ([NSThread isMainThread])
    {
        return [self MR_defaultContext];
    }
    else
    {
        NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
        NSManagedObjectContext *threadContext = [threadDict objectForKey:kMagicalRecordManagedObjectContextKey];
        if (threadContext == nil)
        {
            threadContext = [self MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
            [threadDict setObject:threadContext forKey:kMagicalRecordManagedObjectContextKey];
        }
        return threadContext;
    }
}
4

0 に答える 0