2016-02-26 102 views
1

我們iOS應用程序中的小部件是自定義的,因此我添加了一個功能來刪除部件。爲了保存小部件等的設置,我們的小部件通過App組共享Core Data。但是,當我從小部件中刪除某些東西時,它似乎總是無法正確同步。這主要發生在應用程序在內存中處於活動狀態時。核心數據應用程序組同步(帶擴展)

當我刪除的東西我稱之爲:

-(void)removeWidgetFromUser:(UserModel *)user Widget:(Widget *)widget{ 
    if(widget != nil){ 
     [widgetContext deleteObject:widget]; 

     NSError *error; 
     if (![widgetContext save:&error]) { 
      NSLog(@"Unable to remove widget %@", error); 
     } 
    } 
} 

然後我用蟲洞在我的應用程序同步的核心數據,並調用此:

-(void)updateCoreData{ 
    [self.managedObjectContext refreshAllObjects]; 
} 

我相信這兩種方法得到調用。但是有時應用程序會看到我剛剛移除的小部件,然後它也恰好重新出現在我的小部件中。

編輯: 我覺得發生了什麼是我的應用程序犯規更新CoreData上下文正確,然後小部件實際上是與CoreData在我的應用程序同步。因此,刪除的小部件在一段時間後會重新出現。還是搞清楚了......

回答

0

我終於做到了。通過實施下面的代碼:我NSManagedObjects

- (id)initWithCoder:(NSCoder *)decoder { 
    NSManagedObjectContext *context = [SharedCoreDataObjects sharedInstance].managedObjectContext; // use your NSManagedObjectContext 
    NSPersistentStoreCoordinator *coordinator = [SharedCoreDataObjects sharedInstance].persistentStoreCoordinator; //use your NSPersistentStoreCoordinator 
    NSURL *url = (NSURL *)[decoder decodeObjectForKey:@"URIRepresentation"]; 
    NSManagedObjectID *managedObjectID = [coordinator managedObjectIDForURIRepresentation:url]; 
    self = [context existingObjectWithID:managedObjectID error:nil]; 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:[[self objectID] URIRepresentation] forKey:@"URIRepresentation"]; 
} 

我能夠使用MMWormhole發送NSManagedObjectContextDidSaveNotification 到App,然後調用

[context mergeChangesFromContextDidSaveNotification:messageObject]; 

要讓背景下合併更改。這似乎現在完美的工作!

相關問題