2

NSFetchedResultsController を使用して 1 か月からアプリを構築しており、3.1.2 SDK でアプリをテストしていました。問題は、アプリのあらゆる場所で NSFetchedResultsController を使用していて、SDK の 3.1.2 バージョンで作業していたことです。現在、クライアントは、3.0 バージョンと互換性を持たせる必要があると言い、締め切りが迫っています。

しかし、コントローラーによって処理されるオブジェクトを変更するたびにクラッシュします。アプリケーションは非常に奇妙なエラーでクラッシュします。

この問題は、セクション内の最後のオブジェクトを削除するとき、および変更によってオブジェクトが別のセクションに影響を与えるときに発生します。

Dave Mark と Jeff LaMarche による「iPhone 3 Development Tackling iPhone SDK 3」のサンプル コードを使用しています。リンクテキストからの変更も含めました

アプリケーションがクラッシュしたときのコンソールの出力例を次に示します。

*** キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: '無効な更新: セクションの数が無効です。更新後のテーブル ビューに含まれるセクションの数 (1) は、更新前のテーブル ビューに含まれるセクションの数 (2) に、挿入または削除されたセクションの数 (2 挿入、0削除されました)」2010-03-14 16:23:29.758 Instaproofs[5879:207] Stack: ( 807902715, 7364425, 807986683, 811271572, 815059090, 815007323, 211023, 4363331, 810589786, 807635429, 810579728, 3620573, 3620227, 3614682, 3609719, 27337 、810595174、807686849、807683624、839142449、839142646、814752238)

NSFetchedResultsController が非常にバグが多いことを知っていたら、私は決してそれを使用しませんでした。

基本的に、3.0以降のSDKで正常に動作するには、NSFetchedResultsControllerDelegateが必要です。

誰かが私が間違っていることを理解するのを手伝ってくれれば、命の恩人になります.

4

2 に答える 2

5

エラーメッセージから、セクションを削除する必要があるときにセクションをテーブルに挿入しているように見えます。tableViewに合計4つのセクションを期待するように指示したにもかかわらず、tableView dataSourceは更新後に1つのセクションしか提供していません。

これは NSFetchedResultsController にバグがあるとは思いませんが、単純なユースケース以外で実装するのは難しいと思います。controller:didChangeObject:atIndexPath:forChangeType:newIndexPath デリゲート メソッドの結果として、ほぼ確実にクラッシュが発生しています。このメソッドを (少なくとも私の経験では) うまく実装するための鍵は、changeTypes がオブジェクトと indexPath の両方で駆動されることに留意することです。これにより、「更新」と「移動」が概念的に扱いにくくなります。

新しい sectionNameKeyPath でソートされるように、管理対象オブジェクトが変更された状況を考えてみましょう。概念的には、fetchedResultsController が tableView の新しい見出しの下にオブジェクトをソートするため、オブジェクトは新しいセクションに「移動」したと考えられます。ただし、オブジェクトの indexPath が変更されない場合、fetchedResultsController はこれを「移動」ではなく「更新」と見なします。

さらに悪いことに、変更された管理対象オブジェクトが同じ indexPath を保持していても、fetchedResultsController 内の他のオブジェクトは、変更によってぶつけられたために、新しい indexPath を持つ可能性があります。これは、デリゲート メソッドの「更新」セクションでセクションの挿入とセクションの削除を手動で処理する必要があることを意味します。同様の問題は、デリゲート メソッドの "move" セクションで対処する必要があります。

それほど多くの言葉で説明しようとはしませんが、LaMarche の修正では、できるだけ多くのユース ケースに対応する一般的な方法でこの問題に対処しようとしています。ユース ケースに関連する問題を理解しようとすることで、LaMarche が使用するコードの複雑さを大幅に軽減できる場合があります。デリゲート メソッドの「更新」セクションと「移動」セクションに特に注目してください。これらが問題の原因である可能性が最も高いためです。

于 2010-03-26T20:25:43.553 に答える
0

このリソースをチェックしてください:

http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html

大変助かりました。

于 2010-06-16T14:31:07.723 に答える