小编Rob*_*jke的帖子

导入大型数据集时的核心数据内存使用情况

我现在因为讨厌的核心数据问题而陷入困境大约两周.我阅读了很多博客文章,文章和SO问题/答案,但我仍然无法解决我的问题.

我运行了很多测试,并且能够将更大的问题减少到更小的问题.这将是一个很大的解释,所以请跟我一起!

问题 - 数据模型

我必须得到以下datamodel:

对象A与对象B具有一对多的关系,它与对象C具有另一个一对多的关系.由于核心数据的建议,我必须创建反向关系,因此B的每个实例都指向其父A和相同的C指向其父B.

A <->> B <->> C
Run Code Online (Sandbox Code Playgroud)

问题 - MOC设置

为了保持响应顺畅,我创建了一个三级的managedObjectContext结构.

  1. 父MOC - 使用自己的私有线程运行NSPrivateQueueConcurrencyType,是紧的persistentStoreCoordinator
  2. MainQueue MOC - 在mainThread上运行NSMainQueueConcurrencyType并拥有父MOC 1
  3. 对于每个解析操作,我创建第三个MOC,它也有其私有队列并具有父mainQueue MOC

我的主数据控制器作为观察者被添加到NSManagedObjectContextDidSaveMOC 2 的通知中,因此每次MOC 2保存时performBlock:,MOC1被触发,执行保存操作(由于异步performBlock:).

问题 - 解析

为了将大型JSON文件解析为我的Core Data结构,我编写了一个循环解析器.该解析器首先创建一个新的MOC(3).然后它获取对象A的数据并解析其属性.然后解析器读出B的JSON关系并创建填充数据的相应对象.通过调用addBObject:A 将这些新对象添加到A.因为解析器是循环的,解析B意味着解析C,这里也创建新对象并附加到B.这一切都发生在performBlock:MOC 3上.

  • 解析(创建'A'对象并开始解析B)
    • 解析A(创建'B'对象,将它们附加到A并开始解析C)
      • 解析B(创建'C'对象,将它们附加到B)
        • 解析C(只将数据存储在C对象中)

在每次解析操作之后,我保存MOC 3并在mainThread上调度主MOC(2)的保存操作.由于NSManagedObjectContextDidSave通知MOC 1将异步自动保存.

        if (parsed){
            NSError *error = nil;
            if (![managedObjectContext save:&error])
                NSLog(@"Error while saving parsed data: %@", error);
        }else{ …
Run Code Online (Sandbox Code Playgroud)

memory core-data ios

8
推荐指数
1
解决办法
1978
查看次数

标签 统计

core-data ×1

ios ×1

memory ×1