Nic*_*ada 3 core-data objective-c ios icloud uimanageddocument
我向我的所有实体添加了一个lastModifiedDate属性,以避免在UIManagedDocument与iCloud 同步时出现重复,我发现如果我使用离线设备(iPad)创建新实体,并且同时使用创建相同的实体,我会发生这种情况另一个在线设备(iPhone).
我想在对象发生变化时设置此属性,以便我订阅NSManagedObjectContextObjectsDidChangeNotification.我编写的用于设置lastModifiedDate的代码创建了一个无限循环,因为通过设置lastModificationDate属性,它创建了一个更改,NSManagedObjectContextObjectsDidChangeNotification等将再次通知它...
有可能解决它吗?有没有更好的方法来实现我的目标?我应该将managedObjectContext子类化并覆盖willSave:吗?
//At init...
[[NSNotificationCenter defaultCenter] addObserver:applicationDatabase
selector:@selector(objectsDidChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:applicationDatabase.managedDocument.managedObjectContext];
(void) objectsDidChange: (NSNotification*) note
{
// creates an infinite loop
NSDate *dateOfTheLastModification = [NSDate date];
NSMutableArray *userInfoKeys = [[note.userInfo allKeys] mutableCopy];
for(int i=0; i< userInfoKeys.count;i++){
NSString *key = [userInfoKeys objectAtIndex:i];
if([key isEqualToString:@"managedObjectContext"]){
[userInfoKeys removeObject:key];
}
}
for(NSString *key in userInfoKeys){
NSArray *detail = [note.userInfo objectForKey:key];
for (id object in detail){
[object setValue:dateOfTheLastModification forKey:@"lastModifiedDate"];
}
}
Run Code Online (Sandbox Code Playgroud)
要避免无限循环,可以使用原始访问器设置上次修改日期 :
[object setPrimitiveValue:dateOfTheLastModification forKey:@"lastModifiedDate"];
Run Code Online (Sandbox Code Playgroud)
因为这不会触发另一个"更改"通知.但这也意味着没有观察者会看到这种变化.
覆盖willSave托管对象子类会遇到同样的问题.willSave州的Apple文档:
例如,如果设置了上次修改的时间戳,则应检查先前是否在同一个保存操作中设置了它,或者现有时间戳是否不小于当前时间的小增量.通常,最好为所有正在保存的对象计算一次时间戳(例如,响应a
NSManagedObjectContextWillSaveNotification).
因此,您应该注册NSManagedObjectContextWillSaveNotification,并在托管对象上下文中的所有更新和插入的对象上设置时间戳.注册的方法可能如下所示:
-(void)contextWillSave:(NSNotification *)notify
{
NSManagedObjectContext *context = [notify object];
NSDate *dateOfTheLastModification = [NSDate date];
for (NSManagedObject *obj in [context insertedObjects]) {
[obj setValue:dateOfTheLastModification forKey:@"lastModifiedDate"];
}
for (NSManagedObject *obj in [context updatedObjects]) {
[obj setValue:dateOfTheLastModification forKey:@"lastModifiedDate"];
}
}
Run Code Online (Sandbox Code Playgroud)
这假定您的所有实体都有一个lastModifiedDate属性,否则您必须检查对象的类.