2

私の知る限り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" でしたが、違いはないと思います...

4

1 に答える 1

0

答えは自分で見つけました。どうやら、私は非常に明白ではない方法でpersistentStoreCoordinatorを使用していました-障害のあるデータにアクセスしていました。私は自分の managedObjects が実際には欠陥であることさえ知りませんでした。そして、そのアクセスをバックグラウンド スレッドで行いました。それが私をとても苦しめた原因でした。

それが誰かを助けることを願っています。

于 2013-06-11T15:01:55.920 に答える