【问题标题】:Fixing delay in Core Data Storage修复核心数据存储中的延迟
【发布时间】:2014-08-08 19:45:33
【问题描述】:

所以我在我的应用程序中构建了一个隐藏功能。在我的设置菜单中,我有一个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,但它似乎没有为我的问题提供答案。

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

【问题讨论】:

    标签: objective-c core-data ios7


    【解决方案1】:

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

    你不是在拯救他们。我假设您因此在其他地方看不到变化,因为您使用的是不同的上下文。同时,更改最终会迁移,因为其他人碰巧保存了。

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

    (顺便说一句:键值编码[newOwner setValue:@"userHidden" forKeyPath:@"isHidden"] 风格的机制比使用编辑器生成的托管对象子类更丑陋且效率更低;希望它在您调试时就在那里?)

    【讨论】:

    • 我添加了一个 [context save:&error] 但它似乎并没有改变功能。
    • 您确定在其他地方没有线程限制或上下文生命周期错误吗?托管对象,如果从它们的本机队列/线程中取出,或者如果超出它们的上下文可以正常运行,除非它们不再连接到存储(从技术上讲,你处于未定义行为的领域,但通常根据经验出现是发生了什么;虽然引发异常的可能性一样)
    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多