gpt4 book ai didi

ios - 在 NSManagedObjectsDidChangeNotification 创建无限循环后设置 lastModificationDate 属性

转载 作者:可可西里 更新时间:2023-11-01 17:08:01 25 4
gpt4 key购买 nike

我向所有实体添加了一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com