NSPrivateQueueConcurrencyType未正确保存

时间:2013-10-11 22:45:06

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

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

信息似乎完全正常,因为表格更新时我可以看到UITableView中的新信息正在更新。

现在我遇到的问题是,即使我可以看到信息(从服务器获取信息,存储到核心数据并重新获取以显示在我的UITableView中)如果我然后去关闭我的应用程序并重新打开它,信息不再存在。

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

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

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];
}];

1 个答案:

答案 0 :(得分:12)

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

保存子上下文仅保存到主上下文,并保存主上下文保存到商店文件。

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

// ...
[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)")
}