核心数据应用程序组同步(带扩展名)

时间:2016-02-26 09:59:24

标签: ios core-data ios8-today-widget

我们的iOS应用中的小部件是自定义的,因此我添加了一项功能来删除小部件。要保存小部件等的设置,我们的小部件通过应用程序组共享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同步。因此,删除的小部件会在一段时间后重新显示。还在搞清楚......

1 个答案:

答案 0 :(得分:0)

我终于做到了。通过实现以下代码:

- (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"];
}

在我的NSManagedObjects中,我能够使用MMWormhole发送NSManagedObjectContextDidSaveNotification 到应用程序然后调用

[context mergeChangesFromContextDidSaveNotification:messageObject];

让上下文合并更改。这似乎现在完美无缺!