2016-02-26 4 views
1

Виджеты в нашем приложении iOS являются настраиваемыми, поэтому я добавил функцию для удаления частей виджета. Чтобы сохранить настройки для виджетов и т. Д., Наши виджеты разделяют основные данные через группы приложений. Однако, когда я удаляю что-то из виджета, он, похоже, не всегда правильно синхронизируется. Это происходит, прежде всего, когда приложение активно в памяти.Синхронизация группы приложений Core Data (w/extension)

Когда я удалить то, что я называю это:

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

Я уверен, что и методы получения называется. Но иногда приложение видит виджет, который я только что удалил, а затем он снова появляется в моем виджете.

EDIT: Я думаю, что случается, что контекст CoreData в моем обновлении приложение не суммируется и не правильно, а затем виджет фактически синхронизируется с CoreData в моем приложении. Поэтому удаленный виджет снова появляется через некоторое время. Все еще выясняя это ...

ответ

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 в App, а затем вызвать

[context mergeChangesFromContextDidSaveNotification:messageObject]; 

Для того, чтобы контекст объединить изменения. Кажется, сейчас это отлично работает!

Смежные вопросы