0

プリミティブ セッター (例: ) を使用して(またはそのサブクラス)setPrimitiveValue:forKey:の値を変更する場合、これらの変更は通知の userInfo に含まれますか、それともオブジェクトは通知の updatedObjects にリストされますか?NSManagedObjectsNSManagedObjectContextObjectsDidChangeNSManagedObjectContextDidSave

その後、プリミティブによって設定された値はディスクに保存されますか? (sqlite 永続ストアの使用を想定)

これに関する特定の情報を見つけることができませんでした。限られたテストから推測したり、少なくともそれをより深く理解する (試みない) ことは避けたいと思います。ありがとう!

4

2 に答える 2

0

他の要因を最小限に抑えるために、小さなサンプル プロジェクトを使用してさらにテストを行った結果は次のとおりです。

willChangeValue:forKey:保存は通知に依存します。NSManagedObjectがそのキーに対して KVC に準拠している限り、この呼び出しはオブジェクトのhasChangesフラグを に設定しますYESNSManagedObjectContextObjectsDidChangeこれが発生すると、次の通知にオブジェクトが含まれます。ただし、KVO通知が投稿されたキーに関係なく、NSManagedObjectそれ自体はどの値が変更されたかを正確に認識しています.

たとえば、キー A がプリミティブ セッターを介して変更され、キー B の変更について通知がポストされた場合でも、オブジェクトはキー A の変更に気付くでしょう。

同様に、はNSManagedObjectContextDidSaveオブジェクトのみを保存しますが、通知が投稿されたかどうかに関係なく、オブジェクトはすべての変更された値を認識し、すべての変更がディスクに保存されます。hasChangesYES

didChangeValue:forKey:保存動作に影響がないことに驚きました。ただし、管理を元に戻すことが重要です。これには、機能するプリミティブ セッターの周りの KVO 呼び出しの標準的なラッピングが必要です。

[self willChangeValueForKey:@"key"];
[self setPrimitiveValue:value forKey:@"key"];`
[self didChangeValueForKey:@"key"]; 
于 2013-08-11T20:37:54.303 に答える
0

プリミティブ値を設定するときは、適切な呼び出しを手動で含めて、通知が確実に発生するようにする必要があります。Apple サンプル コード「DateSectionTitles」から:

// getter
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];

// setter
[self willChangeValueForKey:@"timeStamp"];
[self setPrimitiveTimeStamp:newDate];
[self didChangeValueForKey:@"timeStamp"];

NSManagedObjectContextObjectsDidChangeNoticationプリミティブ値を設定すると、通知が発生します。

通知に関しては、ドキュメントによると:

userInfo ディクショナリには、NSInsertedObjectsKey、NSUpdatedObjectsKey、および NSDeletedObjectsKey のキーが含まれています。

于 2013-08-09T10:22:58.370 に答える