0

在我的项目中,我应该下载以这种方式制作的 JSON 文件:

[{"id":"2","n":"One"},{"id":"2","n":"Two"},{"id":"2","n":"Three"},...]

我的代码是这样的:

- (void) startPopulate:(NSArray *)array{

    NSManagedObjectContext *context = [[self sharedAppDelegate] managedObjectContext];

    NSFetchRequest *fetchRequest=[NSFetchRequest fetchRequestWithEntityName:@"Myentity"];
    NSError *error = nil;

    for (id element in array){

        [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"id == %@",[element objectForKey:@"id"]]];
        Myentity *myE = [[context executeFetchRequest:fetchRequest error:&error] lastObject];

        //update
        if (myE != nil){

            myE.id_e = [element objectForKey:@"id"];
            myE.name = [element objectForKey:@"n"];
        }

        //new element
        else{

            Myentity *myE = [NSEntityDescription insertNewObjectForEntityForName:@"Myentity" inManagedObjectContext:context];
            myE.name = [element objectForKey:@"n"];
            myE.id_e = [element objectForKey:@"id"];
        }
    }

    if (![context save:&error]) {
        NSLog(@"couldn't save: %@", [error localizedDescription]);
    }
    else{

        NSLog(@"DB UPDATED");
    }
}

如您所见,我将字典数组传递给该方法,然后检查实体是否存在。它工作正常,我没有细节问题。'问题',如果它是调用它的方式,是我有 12000 个元素,这个方法运行了大约 53 秒。它非常非常慢。我可以采用什么类型的解决方案来加快速度?或者我应该把这个方法放在后台进程中?谢谢

4

2 回答 2

0

以下是在使用核心数据时创建后台线程的方法:

dispatch_queue_t fetchQ = dispatch_queue_create("JSON Fetcher", NULL);
    dispatch_async(fetchQ, ^{
        NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        context.parentContext = self.mainMOC;

        [context performBlock:^{
            // implement your own background code here

            NSError *error;
            if(![context save:&error]) {
                // handle error
            }
        }];
});

您还需要保存结果,以便将它们传播到 mainMOC。希望能帮助到你!

于 2014-04-02T10:53:44.807 回答
0

你应该把它放在后台进程中吗?

绝对地。启动一个后台线程并从您的主上下文创建一个子上下文来完成所有工作。

还能做什么

您对托管对象上下文所做的每个未保存的更改都存储在内存中。在保存之前进行数千次更改是不可取的,因为它会占用大量内存,而且保存时间也会很长。

您可以一次将更新批处理为 100 个更改,并保存每个 100 个块。

备择方案

如果您总是为应用程序加载这些项目,那么您还可以将它们预加载到数据库中并将其捆绑到应用程序本身中。

这样你就不需要在运行时保存它们,因为它们已经在那里了。

于 2014-04-01T08:55:10.373 回答