- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我向所有实体添加了一个 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"];
}
}
最佳答案
为避免无限循环,您可以使用原始访问器:
[object setPrimitiveValue:dateOfTheLastModification forKey:@"lastModifiedDate"];
因为那不会触发另一个“更改”通知。但这也意味着没有观察者会看到变化。
在托管对象子类中覆盖 willSave
会遇到同样的问题。willSave
的 Apple 文档指出:
For example, if you set a last-modified timestamp, you should check whether either you previously set it in the same save operation, or that the existing timestamp is not less than a small delta from the current time. Typically it’s better to calculate the timestamp once for all the objects being saved (for example, in response to an
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"];
}
}
这假设您所有的实体都有一个 lastModifiedDate
属性,否则你必须检查对象的类。
关于ios - 在 NSManagedObjectsDidChangeNotification 创建无限循环后设置 lastModificationDate 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098544/
我向所有实体添加了一个 lastModifiedDate 属性,以避免在将 UIManagedDocument 与 iCloud 同步时出现重复,我发现如果我使用离线设备 (iPad),同时,我使用另
我是一名优秀的程序员,十分优秀!