修复核心数据存储的延迟

时间:2014-08-08 19:45:34

标签: objective-c core-data ios7

所以我在我的应用程序中构建了一个隐藏功能。在我的设置菜单中,我有一个UISwitch,允许用户隐藏自己。我创建了UISwitch的IBAction,如下所示:

-(IBAction)hideUserToggle:(id)sender {

    AppDelegate *newAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [newAppDelegate managedObjectContext];
    NSManagedObject *newOwner;
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"LoggedInUser" inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    NSManagedObject *matches = nil;
    NSError *error;
    NSArray *objects = [context executeFetchRequest:request error:&error];

    newOwner = [NSEntityDescription insertNewObjectForEntityForName:@"LoggedInUser" inManagedObjectContext:context];

    if (_hideUser.on) {

        if ([objects count] == 0) {

            NSLog(@"%@",[error localizedDescription]);
        } else {

            matches = objects[0];
            [newOwner setValue:@"userHidden" forKeyPath:@"isHidden"];
            NSLog(@"%@",[matches valueForKeyPath:@"isHidden"]);
        }
    } else {

        if([objects count] == 0) {

            NSLog(@"%@",[error localizedDescription]);
        } else {

            matches = objects[0];
            [newOwner setValue:@"userNotHidden" forKeyPath:@"isHidden"];
            NSLog(@"%@",[matches valueForKeyPath:@"isHidden"]);
        }
    }
}

这应该设置我用来确定一个人是否被隐藏的核心数据字符串的值,我稍后在我的代码中将其用作加载数据的条件。但是,当我测试此功能时,当用户翻转开关时,它似乎不会更新持久数据存储(核心数据)。我到处都看了看,我发现这里有一个延迟更新核心数据 - > Why does IOS delay when saving core data via a UIManagedDocument,但它似乎无法解决我的问题。

我希望能够翻转开关并保存该值,以便当用户滑动到另一个视图控制器时,它立即意识到用户已经进入"隐藏"或离线,因此它不会显示某些信息。

1 个答案:

答案 0 :(得分:0)

NSManagedObjectContext是一个暂存器。您在上下文中所做的更改仅存在于上下文中,除非或直到您将它们保存到上下文的父级(持久性存储本身或其他上下文)。

你没有保存它们。因此,我假设您没有在其他地方看到此更改,因为您正在使用不同的上下文。与此同时,这种变化最终会迁移,因为其他人恰好会拯救。

有关保存的详细信息,请参阅-save:

(除了:键值编码[newOwner setValue:@"userHidden" forKeyPath:@"isHidden"] - 样式机制比使用编辑器生成的托管对象子类更加丑陋和效率低;希望它在你调试时就在那里?)