私の知る限りManagedObjectContext
、作成されたのと同じスレッドで使用する必要があります。そうしないと、ロックのためにフリーズする可能性があります。
executeFetchRequest:error:
最初に作成されたメインスレッドで作成しようとするとロックがかかる状況がありManagedObjectContext
ます(アプリがバックグラウンドから再開しようとした後にクラッシュレポートがあるため、呼び出しが実際にメインスレッドに表示されることがわかります- 「[APPNAME] は時間内に再開できませんでした」)。
それは変だ。MOC をロックしている原因がわかりません (前述のクラッシュ レポートで他のスレッドがトレースを呼び出しているのを確認できますが、そのようなものはありませんCoreData
)。何が原因で、どのようにデバッグできるのかを本当に知りたいです。
ちなみに、この状況は非常にまれにしか発生しません。そして、問題を解決する可能性のあるいくつかの変更の後、それが再び起こるまで結果はわかりません. それはとてもイライラします。
誰でもこの問題で私を助けることができますか?
アップデート:
ここにいくつかのコードがあります(実際に問題を理解するのに実際に役立つとは思えませんが)
- (NSArray *)existingIncomeInvites
{
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Profile"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"connectionRequestDidReceive = YES"]];
return [self.dataModel.managedObjectContext executeFetchRequest:fetchRequest error:nil];
}
アプリは最後の行でフリーズします
ここにいくつかの他のコードがあります
- (NSManagedObjectContext *)managedObjectContext
{
if (![NSThread isMainThread])
{
LOG(@"Trying to get MOC on main thread!");
}
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (void)showBadgeOnButton
{
NSArray *incomeInvites = [self.dataModel.profileManager existingIncomeInvites];
...
}
そしてshowBadgeOnButton
私から呼び出されます- (void)viewWillAppear:(BOOL)animated
私が最近変更したのはこれです - @"connectionRequestDidReceive = YES" 以前は @"connectionRequestDidReceive == YES" でしたが、違いはないと思います...