2014-09-18 36 views
4

我有一個DataManager類返回的共享實例:核心數據的iOS 8今天的Widget問題

+ (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然後分別修改項目。因此,例如設置item.itemName = @「testName」;然後調用我的保存方法。

我也有一個iOS 8,在我的TodayViewController中,我也調用getItems方法。我有一個NSNotification檢測managedObjectContext保存。

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

這些被重新調取的項目不會被調用,但會返回過期的NSManagedObjects。因此,例如,itemName並未更改爲@「testName」。

我哪裏錯了?如果您需要查看其他代碼,請告知我們。

謝謝!

+0

你的應用程序,你運行的小部件在不同的過程。如果您的應用更改了核心數據存儲,那麼您的小部件將不會收到該應用發送的通知。 – quellish 2014-09-19 01:54:56

+0

@quellish然後檢測變化的最佳方式是什麼? – Stephen 2014-09-19 08:10:26

+1

我有完全相同的問題,但還沒有找到解決方案。只有我能想到,就是「去創造」背景並重新創造它。 – 2014-09-20 17:11:30

回答

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; 

在課堂上我已經手動創建的制定者。如果由於setter的原因,我會刪除所有變量,一旦我在覈心數據管理器類以外的地方讀取它們,它們就會再次被引用。

您可以使用NSUserDefault商店來改善此情況。它正在被正確更新。在主應用程序中,如果您更改smend,請在NSUserDefault中設置標誌。在擴展中,請閱讀此內容,如果標記被標記,則重置核心數據。這樣,你可以節省一些滴答,讓事情變得更快一點。

對於NSUserDefault分配(在這兩個應用 - 延伸和主)使用 - 在這之後,你可以爲usuall從中讀取數據,他們應該是同步的

NSUserDefaults *prefs = [[NSUserDefaults alloc] initWithSuiteName:GROUP_NAME]; //share with extension 
+0

非常感謝您的投入! – Stephen 2014-09-21 17:32:16