1

私のアプリ (対象は iOS 6 以降) には、ダッシュボード ビュー、アクティビティ テーブル ビュー、およびアクティビティの詳細ビューがあります (さらに多くのビューがありますが、このテーマには関係ありません)。

ユーザーがダッシュボードにアクセスしたら、アクティビティの更新を実行します。この間、コア データからアクティビティのリストを取得し、必要に応じて更新します。更新が完了したときにテーブル ビューを開くと、すべて問題ありません。しかし、アップデート中に開くと、アプリがクラッシュします。(テーブルビューでは、コア データ (同じオブジェクト) からアクティビティのリストを読み込みます。

エラー: キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'ALL または ANY 演算子の左側は、NSArray または NSSet のいずれかでなければなりません。'

更新していないときにステートメントが正常に機能するため、このエラーの内容は間違っていると思います

フェッチリクエスト:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Activity" inManagedObjectContext:managedObjectContext]];
[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"followedPlayer"]];
[fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"calendarDate" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"startTime" ascending:YES]]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY typeOfActivity IN %@", array]];

個人的には、1 つのアクティビティの 2 つのインスタンスがあり、1 つが編集されていて、マネージド オブジェクト コンテキストで保存がまだ呼び出されていないことが問題だと思います (マネージド オブジェクト コンテキストはシングルトンです)。その後、save が呼び出されると (または、最初のオブジェクトの変更が保存されていない状態で 2 番目のオブジェクトが作成されると)、アプリがクラッシュします。

この問題は、アクティビティの配列を持つシングルトン クラスを作成して、アクティビティ オブジェクトのインスタンスが常に 1 つだけになるようにする (または、更新中にテーブルビューへのアクセスを単にブロックする) ことで解決できると思います。しかし、これをもっと良い方法で行うことができるのではないかと思います。

私が念頭に置いている方法は、コアデータから読み取り専用/管理されていないオブジェクトを取得することです。これは、sqlite データベースに直接アクセスすることで実行できます。しかし、詳細ビューでは、アクティビティと関係のある他のオブジェクトを取得する必要があるため、実際にはそうではないと思います。

sqliteデータベースに直接アクセスせずに読み取り専用の管理対象オブジェクトまたはそのようなものを取得することが可能である場合(およびその方法)、誰かがいますか?

敬具

印傳紗蓮

4

1 に答える 1

1

Core Data はスレッドセーフではありません。NSManagedObjectContextを共有している場合、またはNSManagedObjectスレッド間でを共有している場合、このような多くの問題が発生することが予想されます。さらに読むには、Concurrency with Core Data を確認してください。

また、iOS 5.0 以降では、concurrencyTypeのを設定できますNSManagedObjectContext3 種類あります。performBlock:キュー ベースのタイプでは、Core Data で行うすべての操作がおよびメソッドを介して行われるようにする必要がありperformBlockAndWait:ます。私は何度か忘れてやけどしました(デッドロックによって現れることがよくあります)。

于 2013-03-16T04:42:40.303 に答える