7

更新 3これらは、空のデータ ストアを使用して最初に実行した後のログです。

2013-02-07 20:57:06.708 Five Hundred Things[14763:c07] mainMOC = <NSManagedObjectContext: 0x7475a90>
2013-02-07 20:57:06.711 Five Hundred Things[14763:1303] Import started
2013-02-07 20:57:06.712 Five Hundred Things[14763:1303] backgroundMOC = <NSManagedObjectContext: 0x8570070>
2013-02-07 20:57:06.717 Five Hundred Things[14763:c07] FRC fetch performed
2013-02-07 20:57:06.718 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1
2013-02-07 20:57:06.720 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1
2013-02-07 20:57:06.720 Five Hundred Things[14763:c07] numberOfRowsInSection returns 0
2013-02-07 20:57:06.728 Five Hundred Things[14763:1303] call contextDidSave
2013-02-07 20:57:06.736 Five Hundred Things[14763:1303] call contextDidSave
2013-02-07 20:57:06.736 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1
2013-02-07 20:57:06.737 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1
2013-02-07 20:57:06.737 Five Hundred Things[14763:c07] numberOfRowsInSection returns 5
2013-02-07 20:57:06.758 Five Hundred Things[14763:1303] call contextDidSave
2013-02-07 20:57:06.759 Five Hundred Things[14763:1303] Refresh complete
2013-02-07 20:57:06.759 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1
2013-02-07 20:57:06.760 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1
2013-02-07 20:57:06.761 Five Hundred Things[14763:c07] numberOfRowsInSection returns 5

FRC フェッチが実行され、セクション内の行数が 0 であることに注意してください。ただし、2 回目の contextDidSave の後、データ ストア内のカテゴリ数と一致するように 5 に変更されます。

クラッシュを伴う 2 回目の実行でのログは次のとおりです。

2013-02-07 21:01:11.578 Five Hundred Things[14800:c07] mainMOC = <NSManagedObjectContext: 0x8225650>
2013-02-07 21:01:11.581 Five Hundred Things[14800:1303] Import started
2013-02-07 21:01:11.582 Five Hundred Things[14800:1303] backgroundMOC = <NSManagedObjectContext: 0x7439850>
2013-02-07 21:01:11.592 Five Hundred Things[14800:c07] FRC fetch performed
2013-02-07 21:01:11.594 Five Hundred Things[14800:c07] cat = Attraction
2013-02-07 21:01:11.594 Five Hundred Things[14800:c07] cat = Beverage
2013-02-07 21:01:11.595 Five Hundred Things[14800:c07] cat = Entertainment
2013-02-07 21:01:11.595 Five Hundred Things[14800:c07] cat = Hotel
2013-02-07 21:01:11.596 Five Hundred Things[14800:c07] cat = Restaurant
2013-02-07 21:01:11.597 Five Hundred Things[14800:c07] numberOfSectionsInTableView returns 1
2013-02-07 21:01:11.598 Five Hundred Things[14800:c07] numberOfSectionsInTableView returns 1
2013-02-07 21:01:11.599 Five Hundred Things[14800:c07] numberOfRowsInSection returns 0
2013-02-07 21:01:11.602 Five Hundred Things[14800:1303] call contextDidSave
2013-02-07 21:01:11.610 Five Hundred Things[14800:1303] call contextDidSave

FRC が初期化され、その直後にカテゴリがログに記録され、実際に FRC にあることが示されます。ただし、セクション内の行数は 0 であり、更新されません。代わりに、アプリは以下のスタックでクラッシュします。

3 回目以降の実行では、ログは次のようになります。

2013-02-07 21:03:55.560 Five Hundred Things[14815:c07] mainMOC = <NSManagedObjectContext: 0x8128860>
2013-02-07 21:03:55.563 Five Hundred Things[14815:1e03] Import started
2013-02-07 21:03:55.564 Five Hundred Things[14815:1e03] backgroundMOC = <NSManagedObjectContext: 0x822b5d0>
2013-02-07 21:03:55.569 Five Hundred Things[14815:c07] FRC fetch performed
2013-02-07 21:03:55.571 Five Hundred Things[14815:c07] cat = Attraction
2013-02-07 21:03:55.572 Five Hundred Things[14815:c07] cat = Beverage
2013-02-07 21:03:55.572 Five Hundred Things[14815:c07] cat = Entertainment
2013-02-07 21:03:55.573 Five Hundred Things[14815:c07] cat = Hotel
2013-02-07 21:03:55.573 Five Hundred Things[14815:c07] cat = Restaurant
2013-02-07 21:03:55.574 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1
2013-02-07 21:03:55.576 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1
2013-02-07 21:03:55.576 Five Hundred Things[14815:c07] numberOfRowsInSection returns 5
2013-02-07 21:03:55.581 Five Hundred Things[14815:1e03] call contextDidSave
2013-02-07 21:03:55.592 Five Hundred Things[14815:1e03] call contextDidSave
2013-02-07 21:03:55.593 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1
2013-02-07 21:03:55.594 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1
2013-02-07 21:03:55.595 Five Hundred Things[14815:c07] numberOfRowsInSection returns 5
2013-02-07 21:03:55.606 Five Hundred Things[14815:1e03] call contextDidSave
2013-02-07 21:03:55.606 Five Hundred Things[14815:1e03] Refresh complete

これは、2 回目の実行で動作がどのように見えるかです。データは既にストアにあり、セクションの行数は 5 を返し、カテゴリはすぐにテーブル ビューに表示されます。


更新 2これは、クラッシュが発生したメイン スレッドのスタック トレースです。メインスレッドで発生しているので、UITableViewと関係があると思います。ただし、UITableView で NSDictionary または NSMutableDictionary を使用していません。私の考えではnumberOfRowsInSection、2 回目の実行で 0 を返すと問題が発生しているのですが、解決方法がわかりません。3回目の実行で正しい数値(使用しているデータで5)を返し、最初の実行でデータストアに正しくデータを入力しているように見えるため、2回目の実行で0を返し、そうしない理由について混乱しています更新しません。

frame #0: 0x013ede52 libobjc.A.dylib`objc_exception_throw
frame #1: 0x020330de CoreFoundation`-[__NSDictionaryM setObject:forKey:] + 158
frame #2: 0x01211d7a CoreData`-[NSFetchedResultsController(PrivateMethods) _preprocessUpdatedObjects:insertsInfo:deletesInfo:updatesInfo:sectionsWithDeletes:newSectionNames:treatAsRefreshes:] + 1994
frame #3: 0x01212ed7 CoreData`-[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 2455
frame #4: 0x00b9e4f9 Foundation`__57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 40
frame #5: 0x0200a0c5 CoreFoundation`___CFXNotificationPost_block_invoke_0 + 85
frame #6: 0x01f64efa CoreFoundation`_CFXNotificationPost + 2122
frame #7: 0x00ad2bb2 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 98
frame #8: 0x01125163 CoreData`-[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83
frame #9: 0x011bed2f CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367
frame #10: 0x01121128 CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _postRefreshedObjectsNotificationAndClearList] + 136
frame #11: 0x0111f8c0 CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 80
frame #12: 0x0111f869 CoreData`-[NSManagedObjectContext processPendingChanges] + 41
frame #13: 0x010f3e38 CoreData`_performRunLoopAction + 280
frame #14: 0x01f78afe CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
frame #15: 0x01f78a3d CoreFoundation`__CFRunLoopDoObservers + 381
frame #16: 0x01f567c2 CoreFoundation`__CFRunLoopRun + 1106
frame #17: 0x01f55f44 CoreFoundation`CFRunLoopRunSpecific + 276
frame #18: 0x01f55e1b CoreFoundation`CFRunLoopRunInMode + 123
frame #19: 0x01f0a7e3 GraphicsServices`GSEventRunModal + 88
frame #20: 0x01f0a668 GraphicsServices`GSEventRun + 104
frame #21: 0x00021ffc UIKit`UIApplicationMain + 1211
frame #22: 0x000022dd Five Hundred Things`main(argc=1, argv=0xbffff31c) + 141 at main.m:16
frame #23: 0x00002205 Five Hundred Things`start + 53

更新:応答がないだけでなく、実際にクラッシュすることができました。

* キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '* setObjectForKey: オブジェクトを nil にすることはできません (キー: _ContentChange_OldIndexPathKey)'

この SO の質問は、エラーに最も近いものですが、キーではなく値が nil であることについて説明しています。カテゴリが Core Data ストアに保存されているときに発生するように見えますが、すべてのカテゴリに値があります。

エンティティ カテゴリには、category_id - 整数 16 category_name - 文字列が含まれます

これはエンティティ Thing と対多の関係にありますが、コードのこの特定の部分はその関係に対して何もしていません。これは、category_id と category_name のみを設定しています。インポートの後半 (問題の MOC 保存後) は、関係が設定されるときです。

インポート操作からの問題のコード:

//import categories

    NSString *categoryPath = [[NSBundle mainBundle] pathForResource:@"category" ofType:@"json"];

    NSData *categoryData = [NSData dataWithContentsOfFile:categoryPath];

    NSDictionary *categoryResults = [NSJSONSerialization
                                     JSONObjectWithData:categoryData
                                     options:NSJSONReadingMutableLeaves
                                     error:&error];

    NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"Category"
                                              inManagedObjectContext:context];

    NSMutableArray *categories = [[NSMutableArray alloc] init];

    NSString *categoryPredicateString = [NSString stringWithFormat: @"category_id == $CATEGORY_ID"];

    NSPredicate *categoryPredicate = [NSPredicate predicateWithFormat:categoryPredicateString];


    for (NSDictionary *categoryKey in categoryResults){

        NSFetchRequest *categoryFetchRequest = [[NSFetchRequest alloc] init];

        [categoryFetchRequest setEntity:categoryEntity];

        NSNumber *categoryID = [NSNumber numberWithInt:[[categoryKey objectForKey:@"category_id"] integerValue]];

        [categories addObject:categoryID];

        NSDictionary *categoryVariables = [NSDictionary dictionaryWithObject:categoryID forKey:@"CATEGORY_ID"];

        NSPredicate *catSubPredicate = [categoryPredicate predicateWithSubstitutionVariables:categoryVariables];

        [categoryFetchRequest setPredicate:catSubPredicate];

        NSArray *categoryArray = [[NSArray alloc] init];
        categoryArray = [context executeFetchRequest:categoryFetchRequest error:&error];

        Category *categoryObject = [categoryArray lastObject];
        NSNumber *categoryNum = [categoryObject valueForKey:@"category_id"];
        NSInteger categoryInt = [categoryNum integerValue];

        if (categoryInt != [[categoryKey objectForKey:@"category_id"] integerValue]){
            categoryObject = [NSEntityDescription
                              insertNewObjectForEntityForName:@"Category"
                              inManagedObjectContext:context];
            categoryObject.category_id = [NSNumber numberWithInt:[[categoryKey objectForKey:@"category_id"] intValue]];
        }
        if (categoryObject.category_name != [categoryKey objectForKey:@"category"]){
            categoryObject.category_name = [categoryKey objectForKey:@"category"];
        }

    }

    //Remove unneeded Categories from Core Data Store

    NSFetchRequest *removeUnusedCategories = [[NSFetchRequest alloc] init];
    [removeUnusedCategories setEntity:categoryEntity];
    NSArray *fetchedCategories = [context executeFetchRequest:removeUnusedCategories error:&error];

    for (Category *fetchedCategory in fetchedCategories){
        if (![categories containsObject:fetchedCategory.category_id]){
            [context deleteObject:fetchedCategory];
            NSLog(@"Object deleted");
        }
    }

    if (![context save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }

これ[context save]はバックグラウンド MOC で発生し、通知センターを通じて (アプリ デリゲート内の) メイン MOC に同期されます。メイン MOC をリッスンしNSManagedObjectContextDidSaveNotificationて実行します。mergeChangesFromContextDidSaveNotification:

最初の実行と 3 回目の実行は完全に機能します。これは常に 2 回目の実行で発生します。


私は iOS プロジェクトで Core Data を使用していますが、これまでのところ、1 つの問題を除いてうまく機能しています。

アプリは、JSON ファイルから Core Data ストアにデータを入力し、最初の UITableViewController は必要に応じてアニメーションをロードします。ただし、アプリを 2 回目に起動すると、最初の UITableView は空白になります。複数の場所でチェックインしましたが、データは 2 回目の起動時に Core Data ストアにありますが、UITableView または NSFetchedResultsController メソッドは呼び出されません。

最初の起動では、セクションの行数は 0 を返しますが、Core Data ストアが読み込まれると、5 が返されます。2 回目の起動では、セクション (1 つのセクションのみ) の行数は 0 を返し、更新されません。3 回目以降のすべての起動では、セクション内の行数は 5 を返します。

アプリの 2 回目の起動時には、UITableView のメソッドcellForRowAtIndexPathも NSFetchedResultsController のメソッドも呼び出されません。didChangeObjectUITableViewController はUITableViewDelegateUITableViewDataSource、およびNSFetchedResultsControllerDelegateです。

コア データ ガイドラインで提案されているように、アプリ デリゲートとテーブル ビュー コントローラーは、別のスレッドのバックグラウンド MOC でデータの読み込みが行われている間、マネージド オブジェクト コンテキストを共有します。これらは、コンテキストの save メソッドが を介して呼び出されたときに同期されますmergeChangesFromContextDidSaveNotification:

再現するには、シミュレーターからアプリを削除し、1 回実行すると、データベースにデータが入力され、アプリが正しく表示されます。アプリを停止して再度実行すると、何も表示されません。アプリを停止して 3 回目に実行すると、正しく表示されます。

アプリの 2 回目の起動を除いて、これはすべて正しく機能しているようです。1 回目と 3 回目は正常に動作します。私は何が欠けていますか?

私のコードに関しては、ここに何を入れればよいかわかりません。UITableViewController の実装から始めましょう。

@implementation FTWTMasterViewController

@synthesize managedObjectContext;
@synthesize categoryController = _categoryController;
@synthesize catLocViewController;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (NSFetchedResultsController *)categoryController {
    if (_categoryController != nil) {
        return _categoryController;
    }

    NSLog(@"tableview MOC = %@", self.managedObjectContext);

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"category_name" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.managedObjectContext
                                          sectionNameKeyPath:nil
                                                   cacheName:@"CategoryTable"];
    _categoryController = theFetchedResultsController;
    _categoryController.delegate = self;

    return _categoryController;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.dataSource = self;
    self.tableView.delegate = self;

    NSError *error;
    if (![[self categoryController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    NSLog(@"Fetch called");

    self.title = @"Categories";
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"number of sections = %lu", (unsigned long)[[self.categoryController sections] count]);
    return [[self.categoryController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id  sectionInfo =
        [[_categoryController sections] objectAtIndex:section];

    NSLog(@"numberOfObjects = %lu", (unsigned long)[sectionInfo numberOfObjects]);
    return [sectionInfo numberOfObjects];
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Category *category = [_categoryController objectAtIndexPath:indexPath];
    cell.textLabel.text = category.category_name;
    NSLog(@"config cell %@", category.category_name);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"tableView setup");
    static NSString *CellIdentifier = @"categoryCell";

    UITableViewCell *cell =
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Category *aCategory = [self.categoryController objectAtIndexPath:indexPath];

    if (self.catLocViewController == nil){
        FTWTCatLocationViewController *aCatLocController = [[FTWTCatLocationViewController alloc] init];
        self.catLocViewController = aCatLocController;
    }

    self.catLocViewController.selectedCat = aCategory;
    aCategory = nil;

    self.catLocViewController.managedObjectContext = self.managedObjectContext;

    [self.navigationController pushViewController:self.catLocViewController animated:YES];

    self.catLocViewController = nil;
}

#pragma mark - Fetched results controller delegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates.
    [self.tableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    NSLog(@"didChangeObject");

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray
                                               arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray
                                               arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];
}

@end
4

2 に答える 2

9

上記のコメントで想定したこととは反対に、 asectionNameKeyPathを指定してテーブル ビュー セクションを作成すると、同じ効果が発生する可能性があります (テスト プログラムでこれを再現できます)。

初めてアプリを起動すると、次のことが起こります。

  1. 永続ストア ファイル「appname.sqlite」が作成されます。
  2. cacheNameセクション キャッシュ ファイルが作成されるように、テーブル ビューのフェッチ結果コントローラーがパラメーター セットで作成されます。この時点で、すべてのセクションは空です。
  3. リソース ファイルから JSON データを読み取り、コンテキストにオブジェクトを追加するバックグラウンド MOC が作成されます。
  4. バックグラウンド MOC が保存されます。

(ちなみに、キャッシュファイルは

   Library/Caches/<bundle-id>/.CoreDataCaches/SectionInfoCaches/<tablename>/sectionInfo

アプリケーションバンドルに含まれています。)

アプリが 2 回目に起動されると、フェッチされた結果コントローラーは、セクション情報キャッシュがまだ有効かどうか、または再作成する必要があるかどうかを確認します。ドキュメントによると、永続ストア ファイルとセクション キャッシュ ファイルの変更時間を比較します。

ここで興味深い部分: (最初の実行で) ストア ファイルの作成 (ステップ 1) と更新されたコンテキストの保存 (ステップ 4)が同じ秒で発生した場合、ストア ファイルの変更日はステップで変更されません。 4!!

したがって、セクション キャッシュ ファイルは引き続き有効であると見なされ、再作成されません。(ステップ 2 で) すべてのセクションが空だったので、FRC はこのキャッシュされた情報を使用し、空のセクションのみを表示します。

バックグラウンド MOC が再び開始され、コンテキストが保存されます。ストア ファイルに新しい変更日が追加されたため、セクションと行はアプリの 3 回目の実行で正しく表示されます。

私の「理論」を確認するために、1回目と2回目の実行の間にストアファイルを手動で「タッチ」して、変更日を強制しました。すべてのセクションと行が正しく表示されました。

(私はこれを iPhone シミュレーターでのみテストしました。HFS+ ファイル システムが一般的に変更日の 1 秒の解像度を持っているのか、それとも SQLite がここで何か特別なことを行っているのかはわかりません。後で調査してみます。)

結論:ストア ファイルの作成と変更されたデータの保存が同時に行われると、必要に応じてセクション情報キャッシュ ファイルが再生成されない可能性があります。

于 2013-02-12T22:44:18.527 に答える
4

私は同じ問題に遭遇しました。データをロードしたとき、最初のロードは問題ありませんでした。アプリを再起動すると、データがテーブルから消えました。これらは私のカウントでした:

self.fetchedResultsController.fetchedObjects: 8
[self.fetchedResultsController.sections count]: 1
[self.fetchedResultsController.sections[0] numberOfObjects]: 0

UI で並べ替えを変更する機能があり、並べ替えを変更してから元に戻すと、問題はなくなりました。これは、キャッシュの問題を明確に示しています。

通話中

[NSFetchedResultsController deleteCacheWithName:nil];

すべてのキャッシュを削除します。

また、今のところキャッシュしないことを選択することにもなりました。これらのテーブルのデータベースに何万ものレコードを保存するとは思わないので、キャッシュによって何かが改善されるかどうかはわかりません。に設定cacheNameするnilと、 のキャッシュが防止されNSFetchedResultsControllerます。

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                    managedObjectContext:self.context
                                                                      sectionNameKeyPath:sectionIdentifier
                                                                               cacheName:nil];
于 2014-12-04T06:07:44.613 に答える