如何使用NSInMemoryStoreType清理NSPersistentStoreCoordinator的内存中对象图?

时间:2017-03-15 07:31:06

标签: ios core-data memory-management nspersistentstore

我正在使用use Doctrine\ORM\Query\ResultSetMapping; $start = ''; $end = ''; $rsm = new ResultSetMapping(); $rsm->addEntityResult('CalendarData', 'c'); $rsm->addFieldResult('c', 'id', 'id'); $rsm->addFieldResult('c', 'start', 'start'); $rsm->addFieldResult('c', 'end', 'end'); $query = $this->_em->createNativeQuery('select * from calendar_data where LEAST(c.end, ?) - GREATEST(c.start, ?) > 0;', $rsm); $query->setParameter(1, $end); $query->setParameter(2, $start); $calendarData = $query->getResult(); NSInMemoryStoreType来维护内存中的实体和关系,因为我不想将其写入磁盘。

所以我计划在某些时候清理内存中的对象图,因为应用程序内存不断增加,因为核心数据对象引用仍在内存中。

如何从内存对象图中删除/重置/删除整个核心数据实体和关系以清理应用内存使用情况?

是否有任何优化的方法可以在需要时处理NSPersistentStoreCoordinator和清理内存?

请注意:我的应用的部署目标是iOS 8.0及更高版本。因此,清理API也应该适用于iOS 8目标。

谢谢!

2 个答案:

答案 0 :(得分:0)

只需删除实体,就像使用任何核心数据设置一样。

答案 1 :(得分:0)

我找到了解决内存存储上下文的工作。这种解决方法是从内存中的对象图中清除一些内存,而不是所有内容。

    if inMemoryManagedObjectContext != nil{

        if let stores = inMemoryManagedObjectContext.persistentStoreCoordinator?.persistentStores{

            for store in stores{

                do{

                    try inMemoryManagedObjectContext.persistentStoreCoordinator?.remove(store)

                }catch{

                    print("Cleanup InMemoryManagedObjectContext error;\(error)")
                }
            }
        }

        inMemoryManagedObjectContext = nil
    }

感谢Jon Rose:如果我必须删除所有实体,那么由于我有更多实体,它会给出性能问题。此外,我不确定删除实体是否会立即清理内存。

感谢Sandeep Bhandari:PersistentContainer可用于iOS 10及更高版本,我的应用程序应支持iOS 8。

上下文重置也不会对内存清理产生任何影响。如果有任何其他方法可以清理内存上下文/ persistentStoreCoordinator,请告诉我。

谢谢!