2

これを自分で再現することはできないため、収集したいくつかのエラー ログを参照するだけです。本当にこれを理解することはできません。クラッシュが発生すると、2 つの FetchedResults コントローラーがアクティブになります。1 つは各カテゴリに含まれる項目の数を表示するメイン画面にあり、もう 1 つはドリルダウンしたカテゴリを処理するためのものです。残りのバックトレースでわかっているのは、ドリルダウン ビューにオブジェクトを挿入すると、この問題が常に発生するということだけです。何か案は?メイン画面のセルを更新し、詳細画面にセルを挿入しないことに問題があることを誰かが少なくとも確認できますか?

エラー:

** 興味深い部分は、この問題に関して私が受け取った 5 ~ 10 個のログで、範囲 {0,3} と境界 [0 .. 1] が常に同じであるように思われる点に注意してください **

アプリケーション固有の情報: * キャッチされない例外 \'NSRangeException\' によりアプリを終了します。理由: \'* -[NSArray indexOfObject:inRange:]: 範囲 {0, 3} が境界 [0 .. 1] を超えています\'

Last Exception Backtrace: 0 CoreFoundation 0x35ad988f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x336fd259 objc_exception_throw + 33
2 CoreFoundation 0x35acda09 -[NSArray indexOfObject:inRange:] + 205
3 CoreData 0x32e8e73d -[_NSDefaultSectionInfo indexOfObject:] + 133
4 CoreData 0x32e8f299 -[NSFetchedResultsController indexPathForObject:] + 149
5 CoreData 0x32e956f5 -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 4361

コントローラーの作成:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:self.groupID];

NSFetchedResultsController コード:

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

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

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

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;
        case NSFetchedResultsChangeMove:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

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

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
}

セルの構成:

-(void)configureCell:(MessageRow *)cell atIndexPath:(NSIndexPath *)indexPath {

    MymanagedObject *myobj = [self.convoController objectAtIndexPath:indexPath];
    cell.title = myobj.title
 }

私のメイン画面では、すべてが基本的に同じ方法で行われることに注意してください。

case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        break;
4

1 に答える 1

0

同様の問題がありました。

コツは、画面上にあるものと画面外にあるものを追跡することです。コールバックでこれらの条件をチェックしNSFetchedResultsControllerDelegate、FRC がオフスクリーン データを参照している場合は更新を行いません。

viewWillAppearたとえば、トリガーを使用して、後で更新に「追いつく」ことができます。

于 2013-01-30T16:55:00.577 に答える