問題タブ [nsfetchedresultscontroller]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2627 参照

iphone - NSFetchedResultsController が他のコンテキストからの更新を表示しない

「メイン」の NSManagedObjectContext に基づいて、UITableView を設定するように NSFetchedResultsController をセットアップしました。

タイマーでは、別の NSManagedObjectContext にオブジェクトを継続的に追加しますが、NSPersistantStoreCoordinator をメイン コンテキストと共有します。

NSManagedObjectContextWillSaveNotification 通知が送信されていることを確認できます。アプリを終了して再起動すると、前回の実行からのすべてのデータが取得されます。ただし、現在の NSFetchedResultsController は更新されません。

テスト プロジェクトを作成し、ここに配置しました。



(最初は、これは複数のスレッドが動作しているために発生していると思っていましたが、すべてが 1 つのスレッドで実行されたときに発生します)。

元の質問

「メイン」の NSManagedObjetContext に基づいて、UITableView を設定するように NSFetchedResultsController をセットアップしました。

バックグラウンド スレッドで、いくつかのオブジェクトを別の NSManagedObjectContext にダウンロードしてインポートしますが、その NSPersistantStoreCoordinator をメイン スレッドのコンテキストと共有します。

NSManagedObjectContextWillSaveNotification 通知を受け取るように登録しています。これらを取得したら、それらをメイン スレッドに転送し、メイン コンテキストに渡します。

デバッガーを使用して、これらが入ってくるのを監視し、それらが実際にコンテキストにオブジェクトを追加していることを確認できます。ただし、NSFetchedResultsController が更新されていません。これをすべてメインスレッドで行うと、うまくいきます。コントローラーで -performFetch: を呼び出すと、コントローラーが更新されるため、新しいオブジェクトが表示されないわけではないことがわかります。

これのほとんどは定型コードであり、異なるスレッドに分割されているだけです。

0 投票する
2 に答える
7173 参照

iphone - コア データ テーブル ビュー セクション NSSortDescriptor を使用して平日で並べ替える

現在、オブジェクトの配列を日順にソートして、正しい順序、つまり月曜日、火曜日、水曜日、開始時間でグループ化できるようにしようとしています。

唯一の問題は、これを行う方法がわからないことです。現在、私のコードは次のようになっています。

助けてください!

0 投票する
3 に答える
1536 参照

iphone - NSFetchedResultsControllerDelegateから遅延/バッチテーブルビューの更新を実装するにはどうすればよいですか?

ドキュメントには次のように書かれています。

変更が行われるたびにテーブルビューを更新するかどうかを慎重に検討する必要があります。多数の変更が同時に行われる場合(たとえば、バックグラウンドスレッドからデータを読み取る場合)、/.../はcontrollerDidChangeContent :(保留中のすべての変更が処理されたときにデリゲートに送信されます)を実装できます。テーブルビューをリロードします。

これはまさに私が行っていることです。異なるManagedObjectContextを使用してバックグラウンドスレッドで受信した変更を処理し、mergeChangesFromContextDidSaveNotification:を使用して結果をメインスレッドMOCにマージします。ここまでは順調ですね。

私はcontroller:didChangeObject:...を実装しないことを選択し、代わりにドキュメントが提案するバッチ更新を実行したいと思います。

質問/問題:ドキュメントには、バッチ更新を実際に実装する方法が詳しく説明されていませんか?controllerDidChangeContentで[tableviewreloadData]を呼び出す必要がありますか?それとも、完全なリロードから私を救う、より邪魔にならない方法がありますか?

私が持っている1つの考え:変更されたオブジェクトを含むmergeChangesFrom ...通知に注意し、それらのインデックスパスを把握し、それらに対してtableview:ReloadRowsAtIndexPaths:を呼び出すことができます。しかし、信頼できる情報、推奨事項、または例はありますか?または単に[tableviewreloadData]?

(余談ですが、controller:didChangeObject:...バッチ更新のセットを受信すると、メインスレッドで実行する前は同じ更新コード(バックグラウンドスレッドに配置)は問題ありませんでしたが、非常に不規則に動作し始めました。もちろん、UIをロックします。)

0 投票する
1 に答える
257 参照

iphone - 1 つの NSFetchedResultsController と複数の UITableViews — 1 つの UITableView だけが更新されますか?

設定:

私はいくつかの UITableViewControllers (tvc) を持っており、それらはすべて個別の NSFetchedResultsController (frc) をインスタンス化します。ただし、これらの frc-s はすべて同じ ManagedObjectContext (moc) を使用します。

シナリオ:

ときどき、tvc-s の 1 つから、バックグラウンド プロセスを起動してデータを更新します。バックグラウンド プロセスは別のスレッドでデータを更新し、最後にメイン スレッドで [moc mergeChangesFromContextDidSaveNotification:] を呼び出します。次に、これらの変更を frc に伝達し、[frcDelegate controllerDidChangeContent:] を呼び出す必要があります。これは正常に機能します...ただし、関連付けられた tvc が更新を開始した frcDelegate に対してのみです。(すべての tvc-s は、その frc の frcDelegate として機能しています。)

予想される行動:

すべての frc-s が同じ moc にバインドされているため、すべての frc-s が変更を取得する必要があり、[frcDelegate controllerDidChangeContent:] がそれらすべてに対して呼び出される必要があります。

実際の動作:

[frcDelegate controllerDidChangeContent:] が 1 つだけ呼び出されます。

予想ではなく実際の動作が見られるのはなぜですか? これをどのようにデバッグすればよいですか? それともこれは正しい動作ですか?

0 投票する
3 に答える
18393 参照

iphone - NSFetchedResultsControllerおよびUISearchDisplayControllerの使用方法

CoreDataを使用してiPhoneアプリを作成しています。

まず、NSFetchedResultsControllerとUISearchDisplayControllerを一緒に使用して結果をフェッチすることは理にかなっていますか?他に何かお勧めしますか?

NSFetchedResultControllerとUISearchDisplayControllerを組み合わせてかなり長い間試してきました。メソッドのNSPredicateをUIViewControllerのNSFetchedResultControllerに設定することを考えていました(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption。しかし、これはうまく機能していません。

それで、私の問題の解決策を実装する方法について何か考えがありますか?回答や優れたチュートリアルへのリンクを投稿していただき、ありがとうございます。

編集

これが私のコードです。(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scopeUISearchDisplayDelegateメソッドは、NSFetchedResultControllerで述語を設定する必要があるメソッドを呼び出します。NSFetchedResultControllerのコードも追加しました。

0 投票する
3 に答える
4217 参照

iphone - SQLite バックエンドで予測された NSFetchedResultsController/NSFetchRequest のパフォーマンスを修正しますか?

いくつかのテーブルビューを強化する一連の NSFetchedResultsControllers があり、デバイスでのパフォーマンスは数秒程度でひどいものでした。すべてがメイン スレッドで実行されるため、起動時にアプリがブロックされます。これは良くありません。

私が調査したところ、述語が問題であることがわかりました。

つまり、フェッチエンティティは、それを「もの」と呼び、エンティティ「何か」と多対多の関係を持っています。この述語は、特定の「何か」と関係があるものだけに結果を制限するフィルターです。

テストのために述語を削除すると、フェッチ時間 (最初の performFetch: 呼び出し) が (極端なケースでは) 4 秒から約 100 ミリ秒以下に減少しました。これは許容範囲です。ただし、Core Data と NSFRC を使用して得ることを望んでいた多くの利点が無効になるため、これには悩まされています。

それで、私の質問は、どうすればこのパフォーマンスを最適化できるでしょうか? 述語を間違って使用していますか? モデル/スキーマを何らかの方法で変更する必要がありますか? そして、これを修正する他の方法は何ですか?この種のパフォーマンスの低下は予想されますか? (1KB 未満のオブジェクトが数百個あります。)

詳細を編集:

コードは次のとおりです。

更新されたログ (以前は、ここでパフォーマンスを低下させるいくつかのアプリケーションの非効率性がありました。これらは、現在の環境で取得できる限り最適に近い更新されたログです):

述語なしで同じフェッチを行う場合 (質問の冒頭にある 2 行をコメントアウトすることにより):

20倍のタイム差。500ミリ秒はそれほど大きくはありません.バックグラウンドスレッドでそれを行う方法や、私が考えることができる最適化する方法はないようです. (これが問題にならないバイナリ ストアに行くことは別として、私はそうするかもしれません。バイナリ ストアのパフォーマンスは、200 を超えるオブジェクトの述語クエリで一貫して ~100 ミリ秒です。)

(以前にここに別の質問をネストしましたが、現在は移動しました)。

0 投票する
1 に答える
1932 参照

iphone - NSFetchedResultController と UISearchBar の実装

iPhone のコア データを使用して単純なナビゲーション ベースのアプリを作成しており、少し検索を実装しようとしています。このアプリは、Apple の「ナビゲーション ベースのアプリケーション」テンプレートに基づいています。NSFetchedResultsController はすべてのオブジェクトを取得し、テーブル ビューに表示されます。また、新しいオブジェクトを追加するためにプラス ボタンを残しました。さて、UISearchBar と UISearchDisplayController を両方とも同じように実装しました。検索では、同じ NSFetchedResultsController を使用してオブジェクトをフィルタリングします。NSPredicate は UISearchDisplayController Delegate メソッドで設定されますが、fetchedResultsController は何もフィルタリングしないため、述語が設定されていないようです。それが私の最初の問題です。今、検索バーのキャンセルボタンを押して、プラスボタンを押して新しいオブジェクトを挿入したいのですが、うまくいきません。オブジェクトは挿入されず、アプリはクラッシュせず、何も起こりません。

1 つのビューで 2 つの異なる NSFetchedResultsController を使用する必要がありますか? はいの場合、これは NSPredicate が設定されていない理由の問題を解決しません。私はすでにあなたの助けに感謝しています.

0 投票する
2 に答える
907 参照

iphone - Core Data / NSManagedObject / NSFetchedResultsControllerのマルチプロパティ「トランザクション」?

NSManagedObjectの複数のプロパティを設定し、NSFetchedResultsControllerにcontrollerDidChangeContentを1回だけ呼び出させることは可能ですか?

言い換えれば、次のようなことを言うことは可能ですか?

次に、NSFetchedResultsControllerにcontrollerDidChangeContent :(および他のメソッド)を1回だけ呼び出させますか?

ありがとう!

0 投票する
3 に答える
3436 参照

iphone - NSFetchRequestControllerのNSSortDescriptorは、ソートされた属性の値が変更されたときにクラッシュを引き起こします

amount(float)、categoryTotal(float)、category(string)などの属性を持つコアデータエンティティがあります

最初のViewControllerは、FethchedResultsControllerを使用してエンティティを取得し、カテゴリ、次にcategoryTotalに基づいてエンティティを並べ替えます。これまでのところ問題はありません。

行(tableView:didSelectRowAtIndexPath)を選択すると、選択したエンティティの金額フィールドを編集できる別のビューコントローラーが読み込まれます。

最初のビューに戻る前に、categoryTotalは新しい'amount'によって更新されます。問題は、最初のView Controllerに戻るときに発生し、アプリは

重大なアプリケーションエラー。Core Data変更処理中に例外がキャッチされました:無効な更新:セクション0の無効な行数。更新後の既存のセクションに含まれる行数(1)は、更新前のそのセクションに含まれる行数と同じである必要があります(1)、プラスまたはマイナスそのセクションから挿入または削除された行数(0が挿入され、1が削除された)。userInfo(null)を使用プログラム受信信号:「EXC_BAD_ACCESS」。

これはNSSortDescriptor*sortByTotals = [[NSSortDescriptor alloc] initWithKey:@ "categoryTotal" ascending:sortOrder];の好意によるようです。これを削除すると、すべてが期待どおりに機能しますが、必要な並べ替えがないことは明らかです。

これは、categoryTotalの変更(削除/挿入)による並べ替え順序の変更に関係していると思いますが、これを修正する方法が見つかりません。2番目のビューで値が正しく変更されていることを確認したので、fetchedResultsControllerが混乱しているように見えます。categoryAmountがソート順を変更しないものに変更された場合、エラーは生成されません。

fetchedResultsControllerが返すアイテムの数を物理的に変更(つまり削除)していません...このエラーを生成しているように見える他の唯一の問題を見つけることができます

どんなアイデアでも大歓迎です

ありがとう、AJ

0 投票する
5 に答える
3968 参照

iphone - NSFetchedResultsController ベースのテーブル ビューは、エンティティの 2 回目の挿入で常に失敗します

NSFetchedResultsController を使用して、フェッチされた管理対象オブジェクトを 1 つのセクションを持つテーブル ビューに表示することを管理しています。テーブルは空の状態で開始され、ユーザーは UI を使用してテーブルに新しいエンティティを追加できます。現状では、プログラムは最初のエンティティを追加するときに常に機能し、2 番目のエンティティを追加すると常にクラッシュします。クラッシュ時にエラーが表示されない場合もあれば、さまざまな種類のエラーが発生する場合もあります (一部を以下に示します)。ログ ステートメントとトレースを通じて、NSFetchResultsController のデリゲートの controllerWillChangeContent ([self.tableView beginUpdates]; を呼び出す) メソッドが終了した直後に、コード内の他のメソッドが呼び出される前に、プログラムがクラッシュすることがわかります。これが私のコードの関連部分の一部です。NSFetchedResultsController の構成:

新しいエンティティの追加:

セクションが 1 つのテーブルを表示する際の問題に関するドキュメントの警告を確認しましたが、Apple の回避策を使用しましたが、役に立ちませんでした。とにかく、これらのメソッドはクラッシュの前に呼び出されません。

私が受け取ったエラーのいくつか:

ご覧のとおり、エラー (表示された場合) は、コードに変更が加えられていない場合でも一貫性がありません。

誰かが私が間違っていることを理解できますか?