0

コア データ データベースには、保存する直前に更新する必要がある計算値がいくつかあります。基本的に、エンティティ間のナビゲーションを容易にするために、いくつかのエンティティに番号を付けています。

現在、私はNSManagedObjectContextWillSaveNotificationそこでこの番号付けを観察し、実行しようとしています。私が行った変更は保存されているように見えますが、元に戻すマネージャーにはまだいくつかの変更が加えられているようです。これにより、管理対象オブジェクトのコンテキストでは ( ) がないことが示されていても、ドキュメントが変更されたように見えます (閉じるボタンにマークを付けますhasChanges)。一度元に戻すと、ドキュメントは変更されていないように見えますが、管理対象オブジェクトのコンテキストは変更されています。

元に戻すマネージャーが何らかの形で間違った場所にリセットされたのでしょうか、それとも私が何か間違ったことをしているのでしょうか?

アップデート

この再番号付けを行っているやや難読化されたコードは次のようになります。

- (void)managedObjectContextWillSave:(NSNotification *)notification
{
    // Force the content view controller to save any pending changes.
    [_contentViewController saveChanges];

    NSArray *itemSortDesc = [self sortDescriptorsForSomeItem];
    NSArray *items = [SomeItem findAllObjectsInContext:self.managedObjectContext
                                             andSortBy:itemSortDesc];
    NSUInteger i = 0;
    for (SomeItem *i in items)
    {
        i.uid = [NSNumber numberWithUnsignedInteger:i++];
    }
}

には、の_contentViewController複数のインスタンスに解析されるテキスト フィールドが含まれていますSomeItem

4

1 に答える 1

0

あなたの番号付けが元に戻すスタックに影響を与えていると思います。

おそらくNSManagedObject willSave使用する代わりにこれを処理しようとしNSManagedObjectContextWillSaveNotificationますが、それでは問題が解決しないと思われます。

これを試すことができます:

[[self.managedObjectContext undoManager] disableUndoRegistration];

// do the renumbering

[self.managedObjectContext processPendingChanges];
[[self.managedObjectContext undoManager] enableUndoRegistration];

これを使用して、初期化中に新しいドキュメントを汚さないようにします。保存のために正しく機能するかどうかはわかりませんが、試してみる価値があるかもしれません.

于 2011-10-10T22:32:00.190 に答える