問題タブ [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.
iphone - NSManagedObjectContextの保存により、NSFetchedResultsControllerが更新されたときにUITableViewの更新を遅らせる
NSFetchedResultsControllerで述語を使用してUITableViewを並べ替えています。ただし、詳細ビューに変更を加えて保存すると、変更したオブジェクトはすぐにUITableViewの新しい場所に配置されます。
メールのメッセージビューに似た上/下ボタンがあります。この動作によりアイテムの順序が乱れます。UXの理由でユーザーがUITableViewに戻るまで、この変更を遅らせたいと思います。UITableViewControllerにNSFetchedResultsControllerDelegateメソッドを実装しました。これを行う簡単で賢い方法はありますか?
編集:以下は、UITableViewControllerに実装されているNSFetchedResultsControllerDelegateメソッドです。
iphone - NSFetchedResultsController への変更後に UITableView が DataSource を更新しない
がUITableView
入力されていNSFetchedResultsController
ます。最初のフェッチは正常に機能します。問題なく追加、削除、変更などを行うことができます..しかし、テーブルにユーザー定義の並べ替えを追加したいと考えています。を別のセットとNSFetchedResultsController
別の を使用するように変更することで、これを行っています。フェッチを変更するコードは次のとおりです。sortDescriptor
sectionNameKeyPath
このメソッドを呼び出すと、うまく機能します。テーブルは、新しいセクション情報と新しい並べ替えパラメーターを使用するために、すぐに並べ替えられます。しかし、データにアイテムを追加または削除すると、TableView はその情報を更新せず、クラッシュを引き起こします。fetchedResultsController 内のオブジェクトの総数のカウントを NSLog して、その増加 (および減少) を確認できますnumberOfRowsInSection
が、そこでの変化を監視するために戻り値を NSLog すると、メソッドが呼び出されますが、値は変化しません。次のクラッシュを取得します(追加用ですが、削除用も同様です)
無効な更新: セクション 2 の行数が無効です。更新後の既存のセクションに含まれる行数 (3) は、更新前にそのセクションに含まれる行数 (3) に、その数をプラスまたはマイナスした値と等しくなければなりません。そのセクションから挿入または削除された行数 (1 挿入、0 削除)。userInfo (ヌル)
アプリを再起動すると、追加されたアイテムが表示されるか、削除されたアイテムが表示されないため、データソースを正しく変更しています。
何か案は?
iphone - NSFetchedResultsControllerがnullのindexPathsを持つオブジェクトを返します
詳細はコメント欄にあります。
次のコード:
結果は次のようになります。
任意のアイデアをいただければ幸いです。参考までに、出発点として別のテンプレートを使用すると、上記のコードは別のアプリケーションで完全に機能します。つまり、「ウィンドウベースのアプリケーション」テンプレートを使用すると、コードが失敗します。「ナビゲーションベースのアプリケーション」を使用すると、コードは期待どおりに機能します。
更新: TechZenは、問題の原因が私のリマインダーエンティティであるかどうか疑問に思っていました。これを調べるのは良い考えだと思ったので、次のことを行いました。
「ウィンドウベースのアプリケーション」と「ナビゲーションベースのアプリケーション」の2つのデフォルトテンプレートアプリケーションを作成します(両方ともCore Dataが有効になっています)。
上記のテストを実行するために必要な最小限のコードをNavベースからWindowベースにコピーしました(ほとんどの場合、「xcdatamodel」ファイル、fetchedresultscontroller、およびテストオブジェクトを追加する方法)。
上記のコードは、新しい「リマインダーエンティティフリー」ウィンドウベースのアプリケーションでも失敗します。(この新しいテストアプリケーションには、実際には(テストコードの外に)自分で作成したコードはありません。すべて、テンプレートコードをカットアンドペーストしただけです。)
だから今、私は「ウィンドウベースのアプリケーション」を作成した後に上記のコードを実行する方法を探しています。誰かが試してみたい場合に備えて、navベースのデフォルトエンティティを使用してテストを実行するコードを次に示します。
更新TechZenが以下に示すように、空のデータベースで実行した場合でもこのコードはクラッシュするため、ウィンドウベースのアプリケーションから開始する場合は、最初にデータベースにいくつかのオブジェクトを追加してから、テストコードを追加してください。
ここでのUPDATEは、新しいカットアンドペーストされたコードを使用した場合の出力です。
更新この問題をSDKバージョン関連の問題に絞り込んだので、Simulator 3.2でビルドするとクラッシュし、Simulator3.1.3でビルドすると正常に動作するプロジェクトができました。しかし、UITableViewControllerを追加し、Simulator 3.2でビルドすると、再び正常に動作します。そこで、質問をするために新しいstackoverflow投稿を作成しました。UITableViewControllerなしでNSFetchedResultsControllerを使用している場合、オブジェクトをどのように操作しますか?(IndexPathsは信頼できないため)。
更新[NSFetchedResultsController fetchedObjects] objectAtIndex:]
この問題は、オブジェクトにアクセスするために-を使用することで(暫定的に)解決されます。
iphone - UITableViewController なしで NSFetchedResultsController を使用する
対応する UITableViewController なしで NSFetchedResultsController を使用しようとすると問題が発生します。
アップルのドキュメントによると:
「NSFetchedResultsController は、Core Data フェッチ要求から返された結果を効率的に管理して、UITableView オブジェクトにデータを提供することを目的としています。」
そのため、UITableViewController なしで NSFetchedResultsController を使用することが推奨されるかどうかを最初に調査し、この Stackoverflow の投稿に遭遇して、少なくともいくつかの状況では、それは悪い考えではないと結論付けました。
しかし、対応する UITableViewController が存在しない場合、NSFetchedResultsController の動作が異なるという問題が発生しました。問題は、UITableViewController が存在しない場合、NSFetchedResultsController によって返されるオブジェクトに IndexPaths がないことです。この問題については、stackoverflow の投稿で文書化しました。(これは問題を単純化したものであることに注意してください。状況によっては、オブジェクトに IndexPaths がありますが、UITableViewController なしで IndexPathsを期待することは悪い考えであると信じるのに十分な問題に遭遇しました。)
IndexPaths がなければ、返されたオブジェクトにソート順でアクセスできず、特定のオブジェクトにアクセスできません。したがって、私が探しているのは、NSFetchedResults コントローラーが IndexPaths を持つオブジェクトを返すようにする方法、またはオブジェクトにアクセスする別の方法です。(または、NSFetchedResultsController をまったく使用すべきではないのでしょうか?)
別の方法としては、fetchedObjects を配列に渡してから、その配列を操作するという 1 つの回避策があります。しかし、私の経験では、FRC オブジェクトへの新しいポインターを作成すると、常に問題が発生します。自分のポインターで NSManagedObject を保持しようとするたびに、最終的にバグが発生したと思います。
参考までに、私が作成しようとしているのは、写真のナビゲーション バーに似たナビゲーション バーです。写真アプリケーションに写真を動的に追加できると想像した場合、バーの写真を NSFetchedResultsController で管理するのは理にかなっています。新しい写真を追加すると、バーの最後に動的に追加されます。 UITableView に新しいオブジェクトを動的に追加する方法。
あなたが私を助けることができるかもしれないアイデアをありがとう!
UPDATEこの問題は (暫定的に) -[NSFetchedResultsController fetchedObjects] objectAtIndex:] を使用して解決されます
iphone - objectAtIndex:0] numberOfObjects]> fetchLimit
現在、FRCのfetchRequestのfetchLimitが4の場合、NSFetchedResultsControllerを使用するUITableViewController / UITableViewが約86個のアイテムを表示するという問題が発生しています。86個のアイテムがフェッチ自体を満たしていること、およびそれらが表示される理由を知っています。これは、didChangeObject:atIndexPath ...が86のそれぞれに対して呼び出され、デフォルトの実装の一種として挿入するためです。
私の質問は、fetchLimitがNSFetchedResultsControllerが「変更」(この場合は挿入)しようとするオブジェクトの数を制限しないのはなぜですか?
私のアプリケーションのユースケースは、最初のタブに、アプリの起動時に(サイドスレッドで)取得する一般的なフィードアイテムが表示されることです。それらを別のコンテキストのCoreDataに保存します。これは、最終的にメインスレッドのコンテキストにマージされ、変更された内容に対してFRCコールバックを開始します。私の質問は、特にアイテムが存在しない最初のケースに関するものです。
これが私のfetchRequestです:
上記のcontentTypeは、このタブに表示されるはずのものと他のタブに表示されるものを区別するための単なる方法です。アイテムのブールプロパティが注目されています。これは、表示用のオンオフスイッチのようなものです。
これが私のdidChangeObjectです:
この質問に答えるのは難しいでしょうが、FRCがdidChangeObjectを呼び出す回数を決定する方法の説明でさえ本当に役に立ちます。
iphone - コア データに変換可能な属性の SortDescriptor を書き込みますか?
エンティティヘッダーがあり、モデルで変換可能と宣言された属性 NSDictionary があります。今、fetchedRequestController でヘッダーの配列をソートしたくありません。nil または null オブジェクトを渡すとエラーが発生します。その緊急を助けてください。
前回から再構成してみましょう: 変換可能な属性ヘッダーを持つエンティティがある場合。生成されたクラスで id タイプを NSDictionary に変更します。entity.attribute name.keyとして辞書のキーにアクセスする必要があります...このクラスはキーのキー値コーディングの苦情ではないため、エラーが発生します:(key)...この問題の回避策は何ですか。
上記のセレクターは、headersDictionary をソートできないため、エラーが発生します...
iphone - iPhone: 別のスレッドからデリゲートとデータの更新を行う NSFetchedResultsController
まず、長すぎる質問で申し訳ありません。
ここには同様の問題について議論する質問がほとんどないことを知っていますが、別のスレッドでのデリゲートと更新を伴う NSFetchedResultsController に関するこれらの話はありません。そして、どの解決策も私を助けてくれませんでした。
既存の質問は次のとおりです。
- NSFetchedResultsController: 更新中に NSManagedObjectContext を使用するとクラッシュする
- NSFetchedResultsController の更新をトリガーしたコア データ属性/プロパティの変更を特定する
- Core Data executeFetchRequest が NSGenericException をスローする (列挙中にコレクションが変更された)
- 列挙中にコレクションが変更されました。どのセットかを判断するには?
- 等
今私の問題について:
- (ソケットを使用して) Web からコア データ オブジェクトを更新する別のスレッドがあります。
- 同じコア データ オブジェクトからのデータを表示するビュー コントローラーはほとんどありません (各タブには、フィルター処理されたデータを表示するビュー コントローラーが含まれています)。
- 各View Controllerには独自のインスタンスが
NSFetchedResultsController
あり、デリゲートはselfに設定されています。
別のスレッドでデータを更新すると例外が発生することwas mutated while being enumerated
があり、アプリがクラッシュすることがあります。
私はそれを修正しようとするために多くのコード操作を行いましたが、何も役に立たないようです.
テーブル ビュー データソース メソッドから管理対象オブジェクトを直接使用しないようにしました。その代わりに、辞書のリストを保持する配列を作成しました。didChangeObject
上記のメソッドでこれらの辞書を埋めます。このようにして、View Controller で管理対象オブジェクトにまったく触れません。
そして、おそらくデータを常に反復する NSFetchedResultsController に問題があることを理解しました。そして、これは別のスレッドで私のデータ更新と競合するオブジェクトです。
問題は、デリゲートを持つ NSFetchedResultsController を取得したら、別のスレッドでコア データ オブジェクトを更新するにはどうすればよいかということです (つまり、データを「監視」し、デリゲートを常に更新することを意味します)。
NSFetchedResultsControllerDelegate の実装:
テーブル ビュー データソース メソッドでは、管理対象オブジェクトを直接操作します。
uitableview - NSFetchedResultsControllerがフェッチされたオブジェクトを複数のUITableViewセクションに割り当てるのはなぜですか?
Core Dataに基づくUITableViewに挿入行を追加することに関する私の別の質問で、NSFetchedResultsControllerがフェッチする各オブジェクトをUITableViewの個別のセクションに割り当てていると述べました。これは単なるデフォルトの動作だと思いましたが、Marcus S. Zarraは、コントローラーの構成またはデータソースのデリゲートメソッドに問題がある可能性があると述べました。確かに、私のコードは、Appleのドキュメントと多数のチュートリアルから抜粋した部分を備えたFrankensteinに少し似ています。これは私の初めてのプログラムであり、Core Dataを使用するのは初めてなので、優しくしてください;)
私のテーブルビューコントローラーのヘッダーは次のとおりです。
私の実装ファイルには、ダミーのテストデータがたくさん含まれています。CoreDataオブジェクトをインスタンス化するために誤ったメソッドを使用している場合に備えてそれを含めました。基本的に、NSFetchedResultsControllerがオブジェクト(この場合はmyClassのインスタンス)を別々のセクションに返さないようにする必要があるかどうかを知りたいです。もしそうなら、私はその問題を作成するために何をしていますか?
現時点での最終的な目標は、テーブルの上部に挿入セルを追加できるようにすることです(挿入セルを下部に配置するのが「標準」であることはわかっていますが、それを実行するアプリでの外観は気に入っています。逆)。セクション0のセルスタイルを挿入するように設定していることに気付くでしょう-tableView:editingStyleForRowAtIndexPath:
が、もちろん、セル0ではなくセル1でmyClass.classTitleのリストを開始する方法を理解する必要があります(これが、各オブジェクトがあるかどうかを判断する理由です。独自のセクションに割り当てられるのは正常です)。
これが私の実装ファイルです:
私のRubricAppDelegateは、コアデータNSManagedObjectContext、NSPersistentStoreCoordinatorなどを設定するためのAppleのドキュメントと基本的に同じです。ただし、問題があると思われる場合は、お知らせください。投稿します。
編集:各オブジェクトが異なるセクションに割り当てられていることを知っている2つの理由について言及するのを忘れました。
1)NSLog(@"Number of sections = %d", [[fetchedResultsController sections] count]);
insideは-numberOfSectionsInTableView:
、私が持っているmyClassオブジェクトの数を返します。
2)-numberOfSectionsInTableView:
1を返すように設定した場合、テーブルには1つのオブジェクトのみが表示され、残りは切り取られます。
iphone - FRC フェッチのオブジェクト数を返すにはどうすればよいですか?
フェッチされたすべてのオブジェクトが UITableView にリストされた後に「追加」セルを作成できるように、FRC フェッチからのオブジェクトの数を使用しようとしています。フェッチされたオブジェクトの数を返す方法はありますか? 特定の FRC のセクション数を返すメソッドしか見つかりません。
iphone - NSFetchedResultsChangeDeleteがトリガーされない
誰かがこれに遭遇したことがありますか?
tableView(FRCによって入力された)から行を削除することを選択した場合、アプリはクラッシュまたはハングしません。何もしません。削除ボタンは選択されたままで、シミュレーターの他の場所をクリックすると、削除ボタンの選択が解除されて消えますが、セルがUIから削除されることはありません。私がここで行っているばかげた見落としがあると確信していますが、私はそれを見つけることができません。以下は私のコードの関連部分です。
UITableViewControllerインターフェイスを次のように宣言しています。
その実装ファイルには、次のものがあります。
と
と
また
上記のコードは、フェッチで入力されたセルのすぐ先のセルを挿入セルにしますが、残りはセルを削除します。
UITableViewを、IBのデリゲートとデータソースのファイルの所有者に接続しています。NSFetchedResultsChangeDelete:
トリガーするには何を変更する必要がありますか?
アップデート:
セルを削除することを選択したときにヒットしていることをブレークポイントに追加[managedObjectContext save:&error];
し、ブレークポイントを介して確認しました。commitEditingStyle
アプリを終了して再実行すると、削除することを選択したセルが実際に削除されるため、保存が正しく処理されていることがわかります。
しかし、削除ボタンを押しても何も起こりません。ボタンは、他の場所をクリックするまで選択されたままになり、選択を解除します。