ios - 将大量数据存储到核心数据中

标签 ios performance core-data optimization large-data

每当用户刷新页面时,我都会将大量 JSON 格式的数据(超过 2000 个实体)加载到核心数据中。我现在正在做的事情很好,但很耗时。我正在考虑使用某种分页,但这需要后端修改。希望有人可以帮助我优化流程。或者为我指出在 iOS 中存储大量数据的另一种解决方案。

这是花费最多时间的部分:

[moc performBlock:^{
    for (NSDictionary *dictionary in dataObjectsArray) {
        NSPredicate *predicate = [ObjectA predicateWithDictionary:dictionary];
        NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:ENTITY_NAME];
        request.predicate = predicate;

        NSError *error;
        NSArray *fetchedObjects = [moc executeFetchRequest:request
                                                     error:&error];
        ObjectA *objectATemp = (ObjectA *)[fetchedObjects lastObject];
        if (!objectATemp) {
            NSEntityDescription *entityDescription = [NSEntityDescription entityForName:ENTITY_NAME
                                                                 inManagedObjectContext:moc];
            objectATemp = [[ObjectA alloc] initWithEntity:entityDescription
                           insertIntoManagedObjectContext:moc];
        }

        [ObjectA setObjectA:objectATemp
                 dictionary:dictionary];

        // check if user already liked the ObjectA
        ObjectB *likedObject = [ObjectB objectBWithId:objectATemp.id];
        if (likedObject &&
            !objectATemp.user_liked.boolValue) {
            [likedObject.managedObjectContext deleteObject:likedObject];
        }
    }

    NSError *error;
    if ([moc hasChanges] &&
        ![moc save:&error]) {
        NSLog(@"%@", error);
    }

    // saving Context
    NSManagedObjectContext *managedObjectContext = [self newManagedObjectContext];
    [managedObjectContext performBlock:^{
        NSError *error;
        if ([managedObjectContext hasChanges] &&
            ![managedObjectContext save:&error]) {
            NSLog(@"%@", error);
        }

        if (completionHandler) {
            completionHandler();
        }
    }];
}];

任何建议都很高兴。

最佳答案

使用 Core Data 存储大量数据不是问题; 2000 条记录甚至不是“很多”。每次用户点击按钮时都保存大量新数据会很慢。最好的解决方案是不需要每次都存储这些数据的所有

但是您的代码中也存在一些明显的低效问题。

您在循环的每一次传递中都执行一个获取请求。假设您的 dataObjectsArray 包含 2000 个对象,即 2000 次提取。这很容易成为获取数据效率最低的方法。如果您可以进行一次获取,或者一次获取 100 或 200 个对象,而不是 2000 次遍历中每次只获取一个,那么您将获得重大改进。很难说最好的方法是什么,因为您没有描述您的谓词或您代码调用的其他方法,但这将是第一件事,它将获得最大的改进。如果您不能以较小的 block 获取数据,您可以至少以较大的 block 处理它。您可能需要更改 setObjectA:dictionary:objectBWithID: 等方法

此外,每次循环运行时,您的某些对象都是相同的。如果一个对象每次都相同,则创建一次,而不是(可能)2000 次。例如,entityDescription。与数以千计的获取请求相比,这个问题要小得多,但它应该提供一些小的改进。

关于ios - 将大量数据存储到核心数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192505/

相关文章:

python - Numpy-native "nested-for-like"结构

jquery - 在 IE7 中获取 ‘Stop running this script’ 消息

c++ - 保存所有简单的计算或在每次需要结果时执行它们?

ios - 核心数据和撤消组

ios - 批量删除请求使应用程序崩溃

ios - 如何设置Touch ID重试次数?

ios - 如何使用 Swift 语法在 GPUImage2 中将两个图像混合在一起

ios - 委托(delegate)返回 nil - Swift

ios - TableView 折叠/展开部分

ios - NSDateFormatter 在 iOS5.0、iOS6.0 中返回 null