CoreDataTableView从子项ManagedObjectContext和Parent ManagedObjectContext保存时不更新 [英] CoreDataTableView Not Updating When Saving From Child ManagedObjectContext and Parent ManagedObjectContext

查看:249
本文介绍了CoreDataTableView从子项ManagedObjectContext和Parent ManagedObjectContext保存时不更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从一个JSON文件中填充上千个条目的CoreData。我想做的是创建一个新的NSManagedObjectContext与父属性设置为我的主NSManagedObjectContext。每次我保存我的孩子上下文,如果成功,然后保存在我的主要上下文。如果这也成功,我尝试重新加载我的tableview。我的CoreDataTableView设置了一个NSFetchedResultController,直接从苹果的文档。但是,表视图不会刷新。有人有任何建议吗?

I'm trying to populate CoreData from a JSON file with thousands of entries. What I'm trying to do is create a new NSManagedObjectContext with the parent property set to my main NSManagedObjectContext. Every so often I save on my child context and if successful then save on my main context. If that's also successful I try to reload my tableview. My CoreDataTableView is setup with an NSFetchedResultController and taken directly from Apple's documentation. However, the table view isn't refreshed. Does anyone have any suggestions?

#pragma mark - Setters

- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
    _managedObjectContext = managedObjectContext;
    if (managedObjectContext) {
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Place"];
        request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"location" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];
        request.predicate = nil; //Fetch all Tags
        self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:managedObjectContext
                                                                          sectionNameKeyPath:@"group"
                                                                                   cacheName:nil];
    }
}


#pragma mark - View Lifecycle

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if (!self.managedObjectContext) {
        [self setupDocument];
    }
}

- (void)parseList
{
    dispatch_queue_t jsonParsing = dispatch_queue_create("json parsing", NULL);
    dispatch_async(jsonParsing, ^{
        //omitted for brevity
        NSArray *places = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&parseError];
        NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        childContext.parentContext = self.managedObjectContext;
        int placesCount = [places count];

        [childContext performBlock:^{
            int count = 0;
            for (NSDictionary *place in places)
            {
               //omitted for brevity. Calls a category on my Place NSManagedObjectSubclass passing in the child context

                count++;

                if (count % 1000 == 0 || count == placesCount) {
                    NSError *error;
                    if ([childContext save:&error]) {
                        NSLog(@"Saved On Child Context");
                        [self.managedObjectContext performBlock:^{
                            NSError *mainError;
                            if ([self.managedObjectContext save:&mainError]) {
                                NSLog(@"Saved On on Parent Context");
                                [self.tableView reloadData];
                            }
                        }]; //End of ManagedObject Block
                    }
                }
            }
        }]; //End of ChildContext Block

    }); //End of Json Parsing Block
}

- (void)setupDocument
{
    NSURL *filePath = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    filePath = [filePath URLByAppendingPathComponent:@"Document"];
    UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:filePath];

    //Create if it doesn't exist
    if (![[NSFileManager defaultManager] fileExistsAtPath:[filePath path]]) {

        //Async save
        [document saveToURL:filePath forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            if (success) {
                self.managedObjectContext = document.managedObjectContext;
                [self parseList];
            }
        }];
    } else if (document.documentState == UIDocumentStateClosed){
        [document openWithCompletionHandler:^(BOOL success){

            //Open it, don't need to refetch stuff
            if (success) {
                self.managedObjectContext = document.managedObjectContext;
            }
        }];
    } else {
        //else use it the managed context
        self.managedObjectContext = document.managedObjectContext;
    }
}


推荐答案

I相信这段代码需要在主线程上执行...

I believe this code needs to be executed on the main thread...

[self.managedObjectContext performBlock:^{
    NSError *mainError;
    if ([self.managedObjectContext save:&mainError]) {
        NSLog(@"Saved On on Parent Context");
        [self.tableView reloadData];
    }
}]; //End of ManagedObject Block


Try wrapping it in a:
dispatch_async(dispatch_get_main_queue(), ^{
}

这篇关于CoreDataTableView从子项ManagedObjectContext和Parent ManagedObjectContext保存时不更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆