核心数据应用程序组同步(带扩展)
Core Data App group synchronization (w/ extension)
我们 iOS 应用程序中的小部件是自定义的,因此我添加了一个功能来删除部分小部件。为了保存小部件等的设置,我们的小部件通过应用程序组共享核心数据。但是,当我从小部件中删除某些内容时,它似乎并不总是正确同步。这主要发生在应用程序在内存中处于活动状态时。
当我删除一些东西时,我称之为:
-(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 同步。因此,删除的小部件会在一段时间后重新出现。还在想办法...
我终于做到了。通过执行以下代码:
- (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];
让上下文合并更改。这似乎现在工作得很好!
我们 iOS 应用程序中的小部件是自定义的,因此我添加了一个功能来删除部分小部件。为了保存小部件等的设置,我们的小部件通过应用程序组共享核心数据。但是,当我从小部件中删除某些内容时,它似乎并不总是正确同步。这主要发生在应用程序在内存中处于活动状态时。
当我删除一些东西时,我称之为:
-(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 同步。因此,删除的小部件会在一段时间后重新出现。还在想办法...
我终于做到了。通过执行以下代码:
- (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];
让上下文合并更改。这似乎现在工作得很好!