2016-02-26 91 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]; 

要让背景下合并更改。这似乎现在完美的工作!