CN110427251A - 一种针对iOS CoreData数据库存储的优化方法 - Google Patents
一种针对iOS CoreData数据库存储的优化方法 Download PDFInfo
- Publication number
- CN110427251A CN110427251A CN201910678639.8A CN201910678639A CN110427251A CN 110427251 A CN110427251 A CN 110427251A CN 201910678639 A CN201910678639 A CN 201910678639A CN 110427251 A CN110427251 A CN 110427251A
- Authority
- CN
- China
- Prior art keywords
- privately owned
- context
- layer
- queue context
- privatecontext
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/215—Improving data quality; Data cleansing, e.g. de-duplication, removing invalid entries or correcting typographical errors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/461—Saving or restoring of program or task context
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Software Systems (AREA)
- Computing Systems (AREA)
- Quality & Reliability (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出了一种针对iOS CoreData数据库存储的优化方法,包括:构建三层上下文结构,其中,第一层为私有队列上下文RootContext,该层私有队列上下文RootContext与中间层连接,中间层进一步与数据库连接;第二层为主队列上下文MainContext,第三层为私有队列上下文PrivateContext;存储开始,针对每次存储均启用新的线程,利用该线程中的PrivateContext进行数据存储操作;操作完成后,将数据自动同步到第二层的主队列上下文MainContext;再由主队列上下文MainContext同步数据至第一层的私有队列上下文RootContext;由第一层的私有队列上下文RootContext通过中间层将数据同步到数据库中。本发明通过构建三层上下文结构,使得数据存储都是异步执行,不会对主线程造成卡顿,并且可以同时批量操作数据,提高数据的存储效率,保证线程安全。
Description
技术领域
本发明涉及iOS CoreData数据库技术领域,特别涉及一种针对iOS CoreData数据库存储的优化方法。
背景技术
Core Data是iOS编程中使用持久化数据存储的一种方式。在一些情况下,可以使用Core Data来持久化数据。需要知道的是,Core Data并不是数据库本身,是Apple提供的对象持久化技术(Object Persistent Technology)。Core Data框架为数据变更管理、对象存储、对象读取恢复的功能提供了支持。它可以使用SQLite作为持久化存储的类型,但本身并不是一个数据库。
但是,现有的iOS CoreData数据库存储效率较低,在主线程使用主队列上下文存储会有阻塞现场,造成UI卡顿。如果使用私有队列异步存储,又不是线程安全的。传统CoreData存储层级设计如图4所示。全局使用一个主队列存储上下文。如果在主线程遇到大量数据存储时,会造成严重的UI卡顿。
发明内容
本发明的目的旨在至少解决所述技术缺陷之一。
为此,本发明的目的在于提出一种针对iOS CoreData数据库存储的优化方法。
为了实现上述目的,本发明的实施例提供一种针对iOS CoreData数据库存储的优化方法,包括如下步骤:
步骤S1,构建三层上下文结构,其中,第一层为私有队列上下文RootContext,该层私有队列上下文RootContext与中间层连接,所述中间层进一步与数据库连接;第二层为主队列上下文MainContext,第三层为私有队列上下文PrivateContext,该层私有队列上下文PrivateContext包括多个线程的私有队列上下文,并且保证每个线程独享一个上下文;
步骤S2,存储开始,针对每次存储均启用新的线程,利用该线程中的PrivateContext进行数据存储操作;
步骤S3,操作完成后,将数据自动同步到第二层的主队列上下文MainContext;再由主队列上下文MainContext同步数据至第一层的私有队列上下文RootContext;
步骤S4,由第一层的私有队列上下文RootContext通过中间层将数据同步到数据库中。
进一步,在所述步骤S1中,利用所述中间层对所述第一层为私有队列上下文RootContext和数据库文件中间进行数据同步。
进一步,在所述步骤S1中,每个所述线程仅持有一个私有队列上下文PrivateContext。
进一步,在所述步骤S2中,针对每次存储均启用新的线程,首先检测该线程中是否已经存在私有队列上下文PrivateContext,如果有则利用该私有队列上下文PrivateContext进行数据操作;如果线程中没有私有队列上下文PrivateContext,再生成新的私有队列上下文PrivateContext,并将该新的私有队列上下文PrivateContext关联到新的线程上,利用该私有队列上下文PrivateContext进行数据操作。
根据本发明实施例的针对iOS CoreData数据库存储的优化方法,通过将私有队列上下文和主队列上下文两种存储模式混合使用,构建三层上下文结构,提供一种线程安全的高效存储方法,可以优化iOS CoreData数据库存储效率,支持多线程并发存储,保证线程安全。本发明通过构建三层上下文结构,使得数据存储都是异步执行,不会对主线程(UI)造成卡顿,并且可以同时批量操作数据,提高数据的存储效率,保证线程安全。
本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1为根据本发明实施例的针对iOS CoreData数据库存储的优化方法的流程图;
图2为根据本发明实施例的上下文层次架构图;
图3为根据本发明实施例的数据存储的流程图;
图4为传统CoreData存储层级设计示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。
本发明提供一种针对iOS CoreData数据库存储的优化方法,该方法对iOSCoreData数据存储提供了两种存储模式:主队列存储、私有队列存储。由于主队列存储会存在卡顿UI的问题;私有队列存储不存在卡顿UI,但不是线程安全的。本发明通过将两种存储模式混合使用,搭建出一种线程安全的高效存储方案。
下面对本发明中的上下文、主队列上下文和私有队列上下文进行说明:
(1)上下文:对应NSManagedObjectContext类的实例,用于查询,修改,删除,增加数据库中的数据。
(2)主队列上下文:对数据库的操作都在主队列中完成。如果耗时长,会造成明显的UI卡顿。
(3)私有队列上下文:对数据库的操作在私有队列中完成,不会卡顿UI,但不是线程安全的。
如图1所示,本发明实施例的针对iOS CoreData数据库存储的优化方法,包括如下步骤:
步骤S1,构建三层上下文结构。
参考图2,第一层为私有队列上下文RootContext,该层私有队列上下文RootContext与中间层Persistent Store Coordinator直接连接,中间层PersistentStore Coordinator进一步与数据库DB连接。利用中间层Persistent Store Coordinator对第一层为私有队列上下文RootContext和数据库文件中间进行数据同步。由于是私有队列上下文,在和Persistent Store Coordinator通信时,可以实现并发存储,提高效率。
第二层为主队列上下文MainContext,其父上下文为RootContext。由于是主队列上下文,所有的操作都会依次执行。
第三层为私有队列上下文PrivateContext,该层私有队列上下文PrivateContext包括多个线程的私有队列上下文,并且保证每个线程独享一个上下文。其中,私有队列上下文PrivateContext的父上下文为MainContext。由于私有队列上下文不是线程安全的,本发明需要保证每个线程只能持有一个私有队列上下文PrivateContext。同一个线程针对数据库的所有操作都通过这个上下文来实现。
步骤S2,存储开始,针对每次存储均启用新的线程,利用该线程中的PrivateContext进行数据存储操作。
参考图3,每一次存储都新开子线程来使用PrivateContext进行操作。由于是子线程,针对数据的操作不会阻塞UI。
具体的,针对每次存储均启用新的线程,首先检测该线程中是否已经存在私有队列上下文PrivateContext,如果有则利用该私有队列上下文PrivateContext进行数据操作;如果线程中没有私有队列上下文PrivateContext,再生成新的私有队列上下文PrivateContext,并将该新的私有队列上下文PrivateContext关联到新的线程上,利用该私有队列上下文PrivateContext进行数据操作。
步骤S3,操作完成后,将数据自动同步到第二层的主队列上下文MainContext;由于MainContext是主队列上线文,可以保证多个PrivateContext同时同步数据到MainContext时不会产生线程问题。再由主队列上下文MainContext同步数据至第一层的私有队列上下文RootContext;
步骤S4,由第一层的私有队列上下文RootContext通过中间层将数据同步到数据库中。由于RootContext是私有队列上下文,在真正将数据同步到数据库时,也不会对UI造成阻塞。
根据本发明实施例的针对iOS CoreData数据库存储的优化方法,通过将私有队列上下文和主队列上下文两种存储模式混合使用,构建三层上下文结构,提供一种线程安全的高效存储方法,可以优化iOS CoreData数据库存储效率,支持多线程并发存储,保证线程安全。本发明通过构建三层上下文结构,使得数据存储都是异步执行,不会对主线程(UI)造成卡顿,并且可以同时批量操作数据,提高数据的存储效率,保证线程安全。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在不脱离本发明的原理和宗旨的情况下在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。本发明的范围由所附权利要求及其等同限定。
Claims (4)
1.一种针对iOS CoreData数据库存储的优化方法,其特征在于,包括如下步骤:
步骤S1,构建三层上下文结构,其中,第一层为私有队列上下文RootContext,该层私有队列上下文RootContext与中间层连接,所述中间层进一步与数据库连接;第二层为主队列上下文MainContext,第三层为私有队列上下文PrivateContext,该层私有队列上下文PrivateContext包括:多个线程的私有队列上下文,并且保证每个线程独享一个上下文;
步骤S2,存储开始,针对每次存储均启用新的线程,利用该线程中的PrivateContext进行数据存储操作;
步骤S3,操作完成后,将数据自动同步到第二层的主队列上下文MainContext;再由主队列上下文MainContext同步数据至第一层的私有队列上下文RootContext;
步骤S4,由第一层的私有队列上下文RootContext通过中间层将数据同步到数据库中。
2.如权利要求1所述的针对iOS CoreData数据库存储的优化方法,其特征在于,在所述步骤S1中,利用所述中间层对所述第一层为私有队列上下文RootContext和数据库文件中间进行数据同步。
3.如权利要求1所述的针对iOS CoreData数据库存储的优化方法,其特征在于,在所述步骤S1中,每个所述线程仅持有一个私有队列上下文PrivateContext。
4.如权利要求1所述的针对iOS CoreData数据库存储的优化方法,其特征在于,在所述步骤S2中,针对每次存储均启用新的线程,首先检测该线程中是否已经存在私有队列上下文PrivateContext,如果有则利用该私有队列上下文PrivateContext进行数据操作;如果线程中没有私有队列上下文PrivateContext,再生成新的私有队列上下文PrivateContext,并将该新的私有队列上下文PrivateContext关联到新的线程上,利用该私有队列上下文PrivateContext进行数据操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910678639.8A CN110427251A (zh) | 2019-07-25 | 2019-07-25 | 一种针对iOS CoreData数据库存储的优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910678639.8A CN110427251A (zh) | 2019-07-25 | 2019-07-25 | 一种针对iOS CoreData数据库存储的优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110427251A true CN110427251A (zh) | 2019-11-08 |
Family
ID=68410805
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910678639.8A Pending CN110427251A (zh) | 2019-07-25 | 2019-07-25 | 一种针对iOS CoreData数据库存储的优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110427251A (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012044676A2 (en) * | 2010-10-01 | 2012-04-05 | Imerj, Llc | Application mirroring using multiple graphics contexts |
CN109634936A (zh) * | 2018-12-13 | 2019-04-16 | 山东浪潮通软信息科技有限公司 | 一种在iOS系统上处理大批量数据的存储方法 |
-
2019
- 2019-07-25 CN CN201910678639.8A patent/CN110427251A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012044676A2 (en) * | 2010-10-01 | 2012-04-05 | Imerj, Llc | Application mirroring using multiple graphics contexts |
CN109634936A (zh) * | 2018-12-13 | 2019-04-16 | 山东浪潮通软信息科技有限公司 | 一种在iOS系统上处理大批量数据的存储方法 |
Non-Patent Citations (3)
Title |
---|
WILLMO: "CoreData多线程下NSManagedObjectContext的使用", 《CSDN》 * |
刘小壮: "认识CoreData-多线程", 《简书》 * |
陈东明: "《Python编程及其在网络科学中的应用》", 30 November 2018 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103259718B (zh) | 一种流表转换方法和装置 | |
CN103765381B (zh) | 对b+树的并行操作 | |
CN101247293B (zh) | 自动测试方法及系统 | |
CN108388615B (zh) | 一种数据交换方法、系统以及电子设备 | |
CN103680411B (zh) | 一种led显示模组单点校正数据的单线传输电路和方法 | |
CN108132838A (zh) | 一种图数据处理的方法、装置及系统 | |
CN101330412B (zh) | 一种基于拓扑发现的自动化测试方法及系统 | |
CN102105937B (zh) | 简易恢复再现装置及简易恢复再现方法 | |
CN103312424B (zh) | 自动测试系统中多开关的控制方法及控制系统 | |
WO2006044914A3 (en) | Method, system and storage medium for managing automated system events | |
CN105635311A (zh) | 一种云管理平台中资源池信息同步的方法 | |
CN105989006A (zh) | 数据迁移方法和装置 | |
CN106484464A (zh) | 调谐器芯片驱动方法和电子设备 | |
CN107357630A (zh) | 一种实现虚拟机同步的方法、装置和存储介质 | |
CN104092240B (zh) | 一种光伏组件接入模式的识别方法及系统 | |
CN110427251A (zh) | 一种针对iOS CoreData数据库存储的优化方法 | |
CN102880450A (zh) | 即时通信窗口管理方法和设备 | |
CN107145397A (zh) | 一种基于账号的跨系统数据同步方法及系统 | |
CN105988863A (zh) | 一种处理事件的方法及装置 | |
CN101470626A (zh) | 一种任务排序方法 | |
CN109753357A (zh) | 虚拟机管理平台的资源及网络拓扑构建方法、设备、介质 | |
CN104391735B (zh) | 虚拟化一体机集群中虚拟机调度方法及系统 | |
CN106384292A (zh) | 社交网络用户关系采集系统及方法 | |
CN106021100A (zh) | 一种支持并行测试的测试任务运行调度方法 | |
CN102508670A (zh) | 一种定制电视软件方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20191108 |
|
RJ01 | Rejection of invention patent application after publication |