2017-02-16 66 views
0

每次我与我的服务器同步时,我刷新我的CoreData对象的所有字段。仅当CoreData对象发生更改时才会通知?

即使没有任何变化,我仍然会在我的代码的其他地方收到NSManagedObjectContextObjectsDidChangeNotification

  • 这是预期的行为吗?
  • 我该如何防止这种情况发生,并且只有在某些事情已经发生变化时才会得到通知?

当我在刷新对象后添加下面的代码时,事情就像我想要的那样工作。但为什么CoreData不能解决这个问题?

if (object.changedValues.count == 0) 
{ 
    [object.managedObjectContext refreshObject:object mergeChanges:NO]; 
} 

回答

-2
  • 是,即使值不会改变新写道:管理对象上下文仍在发生。因此,NSManagedObjectContextObjectsDidChangeNotification预计将被解雇。

考虑使用NSFetchedResultsController为:

@interface CoreDataHelper : NSObject <NSFetchedResultsControllerDelegate> 

@property (nonatomic, readonly) NSManagedObjectContext *context; 

+ (instancetype)sharedInstance; 

@end 

@implementation 
@synthesize context = _context; 

+ (instancetype)sharedInstance{ 
    static dispatch_once_t once; 
    static CoreDataHelper *sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [self new]; 
    }); 
    return sharedInstance; 
} 

- (NSManagedObjectContext *)context{ 

    if (_context != nil) { 
     return _context; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; // you know what goes in PSC here, right? 
    if (!coordinator) { 
     NSLOG(@"Argh! coordinator == nil"); 
     return nil; 
    } 

    _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    [_context setPersistentStoreCoordinator:coordinator]; 
    return _context; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller{ 
/* 
This function will be invoked by the OS whenever a Managed Object changes. 
Keep in mind that this will be invoked on the Managed Object Context Queue. 
This is the place where your logic to be performed whenever a object changes needs to be. 
*/ 
} 

@end 

//现在在你的文件现在

NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[CoreDataHelper sharedInstance].context sectionNameKeyPath:nil cacheName:nil]; 

fetchedResultsController.delegate = [CoreDataHelper sharedInstance]; 

NSError *error; 
if (![fetchedResultsController performFetch:&error]){ 
    NSLOG(@"fetch error %@", error); 
} 

,因为我们已经迷上了selffetchedResultsController代表,self需要符合到NSFetchedResultsControllerDelegate协议。
您选择覆盖所有的可选方法,最直接的幸福:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

+0

谢谢你的努力,但视图控制器不涉及所以这并不能帮助我。除了在每个对象上测试'changedValues'并抛弃非变化之外,是否无法避免通知? –

+0

好吧,'self'可以是NSObject类的任何实例,不一定(甚至通常)是UIViewController。你可以有一个Core Data Helper单例或一个类的简单实例,例如'@interface CoreDataHelper:NSObject' – ystack

+0

我不清楚你的意思。 –

相关问题