4

共有インスタンスを返す DataManager クラスがあります。

+ (DataManager *)sharedInstance;
{
    static DataManager *sharedInstance = nil;
    static dispatch_once_t pred;

    dispatch_once(&pred, ^{
        sharedInstance = [[DataManager alloc] init];
    });

    return sharedInstance;
}

ここでは、managedObjectContext、managedObjectModel、persistentStoreCoordinator を追跡します。

表示するアイテムを引き出す方法もあります。

- (NSArray *)getItems
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
    return [[self managedObjectContext] executeFetchRequest:fetchRequest error:nil];
}

これで getItems を呼び出してアイテムを個別に変更すると、メイン アプリにビュー コントローラーが表示されます。たとえば、set item.itemName = @"testName"; 次に、save メソッドを呼び出します。

また、TodayViewController で getItems メソッドも呼び出す iOS 8 もあります。managedObjectContext の保存を検出する NSNotification があります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refetchItems) name:NSManagedObjectContextDidSaveNotification object:[[DataManager sharedInstance] managedObjectContext]];

これらの再フェッチされたアイテムは呼び出されますが、古い NSManagedObjects を返します。たとえば、itemName は @"testName" に変更されていません。

どこが間違っていますか?他のコードを見る必要がある場合はお知らせください。

ありがとう!

4

1 に答える 1

7

特定の ManagedObject を更新するには、次の方法を試してください。また、ManagedObject のリストを更新する場合は、各オブジェクトをループしてコマンドを実行します。

[_managedObjectContext refreshObject:act mergeChanges:YES];

または、iOS バージョン 8.3 以降では、次のメソッドを使用して、次のようにコンテキスト内のすべての ManagedObject を一度に更新できます。

[_managedObjectContext refreshAllObjects];

少しは機能しますが、データの追加や削除ではなく、データの更新のみです。

機能しない場合は、追加することもできます

[_managedObjectContext reset];

その後、コア データ ストアから読み込んだすべての変数を「再割り当て」する必要があります。

別の解決策(遅くて醜い)

上記が機能しない場合、別の解決策は、現在のコンテキストを削除して再度作成することです。

設定しただけ

_persistentStoreCoordinator = nil;
_managedObjectModel = nil;
_managedObjectContext = nil;

このプロパティを持つ CoreDataManager クラスがあります

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

クラスでは、セッターを手動で作成しました。セッターが原因ですべての変数を無効にすると、コア データ マネージャー クラスの外で変数を読み取ると、再び初期化されます。

NSUserDefaultストアを使用することでこれを改善できます。正常に更新されています。メインアプリで、何かを変更する場合は、フラグを設定しNSUserDefaultます。拡張では、これを読み、フラグがマークされている場合は、コア データをリセットします。このようにして、いくつかのティックを節約し、物事を少し速くします。

(拡張機能とメインの両方のアプリで)の割り当てにはNSUserDefault、これを使用します-その後、通常どおりデータを読み取ることができ、同期する必要があります

NSUserDefaults *prefs = [[NSUserDefaults alloc] initWithSuiteName:GROUP_NAME]; //share with extension
于 2014-09-21T16:40:21.517 に答える