Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保存时出现核心数据性能问题_Ios_Sqlite_Core Data - Fatal编程技术网

Ios 保存时出现核心数据性能问题

Ios 保存时出现核心数据性能问题,ios,sqlite,core-data,Ios,Sqlite,Core Data,我正在使用NSSqliteStoreType的核心数据在我的iOS应用程序中存储数据。 我需要将大量对象存储到数据库中。 为了提高核心数据的性能,我考虑了很多因素,如: 批量保存 仅在for循环结束后保存 清除上下文以管理内存 但要保存10万个对象却要花很多时间。请向我推荐在保存大量数据的同时提高核心数据性能的最佳做法 您应该在非UI线程上执行导入,该线程的上下文直接绑定到持久存储协调器,而不是主上下文的子上下文 根据对象大小和图形复杂度,每插入数百个新对象,您应该调用一次[managedObj

我正在使用NSSqliteStoreType的核心数据在我的iOS应用程序中存储数据。 我需要将大量对象存储到数据库中。 为了提高核心数据的性能,我考虑了很多因素,如:

  • 批量保存
  • 仅在for循环结束后保存
  • 清除上下文以管理内存
  • 但要保存10万个对象却要花很多时间。请向我推荐在保存大量数据的同时提高核心数据性能的最佳做法

  • 您应该在非UI线程上执行导入,该线程的上下文直接绑定到持久存储协调器,而不是主上下文的子上下文
  • 根据对象大小和图形复杂度,每插入数百个新对象,您应该调用一次
    [managedObjectContext save]
    。有关详细信息,请参阅
  • 您应该在
    @autoreleasepool
    块中包装步骤2中的批处理,并在保存后重置上下文,然后退出autorelease块。看

  • <>你应该考虑用预先填充的数据来传输应用程序,以避免导入的大部分开销。假设数据足够静态(大多数数据是静态的),您可以预加载所有数据,直到应用程序发布时为止,然后当应用程序启动时,它只需要获取发货日期(或上次刷新日期)前的数据


    正如Leonid Usov所说,您还应该在后台上下文中进行导入,并批量保存到磁盘。这将有助于降低内存和提高UI性能。但是在数据结束时,导入大量数据是一项密集的工作,应该尽可能通过预加载来避免。

    将其作为一个孩子而不是一个单独的上下文并不是一个主要的性能变化。使用子上下文的代码更少,导致性能问题的机会也更少。这通常是更安全的路线。@MarcusS.Zarra哦,是的。当您执行
    保存
    时,将其设为子上下文会阻塞主线程(很好地在主线程上进行调用),并在那里传输数据。这意味着要将数据真正刷新到磁盘,您必须在主上下文上调用
    save
    ,该上下文将在主线程上运行。然后重置它将意味着您的应用程序数据将从内存中卸载。。。简言之,这确实有区别。它也不是更多的代码,只需将协调器设置为上下文即可。