【问题标题】:NSPrivateQueueConcurrencyType Not saving properlyNSPrivateQueueConcurrencyType 未正确保存
【发布时间】:2013-10-20 03:20:17
【问题描述】:

AFNetworking 从我的应用服务器获取信息后,将调用以下方法以填充我的Core-Data

当表格更新时,我可以在UITableView 中看到正在更新的新信息。

现在我遇到的问题是即使我可以看到信息(在从服务器获取信息、存储到核心数据并重新获取以显示在我的UITableView 之后)如果我然后去关闭我的app再打开,信息就没有了。

似乎信息不是持久的,问题似乎出在线程上。鉴于如果我在我的方法中删除线程选项一切正常。

我错过了什么?我已经尝试了我遇到的大多数事情,但我似乎找不到解决方案。

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc]
                                        initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childContext.parentContext = managedObjectContext;
myModel.context = childContext;


   [childContext performBlock:^{
// ... Lots Controller logic code that then calls the class myModel where all my Core-Data save methods are

    // Sort Wall Pictures
                    if ( [dataHolder[@"verb"] isEqualToString:@"addWallPicture"] ) {
                        data = @{  @"resourceID":dataHolder[@"_id"][@"$id"],
                                   @"resourceName":dataHolder[@"details"][@"resourceName"],
                                   @"author":@{ @"id":dataHolder[@"userId"][@"$id"],
                                                @"username":dataHolder[@"details"][@"authorName"] },
                                   @"likesNumber":@0,
                                   @"likesPeople":@[]
                                   };

                        [myModel saveSocialWall:data date:date verb:dataHolder[@"verb"] code:dataHolder[@"_id"][@"$id"] myUser:myUser];
                        continue;
                    }
[childContext save:&error];
}];

【问题讨论】:

  • 您是否也保存主要上下文?保存子上下文只保存到主上下文,保存主上下文保存到存储文件。
  • 线程完成后如何保存主上下文?

标签: objective-c cocoa-touch cocoa core-data nsmanagedobject


【解决方案1】:

您还必须在某些时候保存主要上下文,例如保存子上下文后。

保存子上下文只保存到主上下文,保存主上下文保存到存储文件。

这样(写在手机上,会有 是语法错误):

// ...
[childContext save:&error];
[mainContext performBlock:^{
    [mainContext save:&error];
}];

Swift 2.0 中:

do {
    try childContext.save()
    mainContext.performBlock { 
        do {
            try mainContext.save()
        } catch let err as NSError {
            print("Could not save main context: \(err.localizedDescription)")
        }
    }
} catch let err as NSError {
    print("Could not save private context: \(err.localizedDescription)")
}

【讨论】:

  • 如何忽略 childContext 所做的更改。因为如果我不想保存childContext,我在Core Data上做一些其他操作并保存在mainContext上,那么之前的childContext也会被保存吗?
  • @Vacca:保存 child 上下文会将其更改合并到父上下文(主上下文)。保存 main 上下文会保存到持久存储(如果它没有另一个父级),但不会修改子上下文。
  • 不,我是说如果我在保存子上下文时不保存我的 RootParentContext (Main) 怎么办,由于某些情况,我必须忽略这些更改。之后,在下一跳保存时,如果某些操作尝试在 Root(主)上保存,之前的 Child Context 更改会被保存还是忽略?
  • 这是否意味着,保存子上下文会将数据保留在本地,如果我们在不保存主上下文的情况下终止应用程序,数据库中不会保存任何内容?
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多