我觉得必须有客户端 - 服务器同步模式.但我完全没有谷歌一个.
情况非常简单 - 服务器是中心节点,多个客户端连接并操作相同的数据.数据可以在原子中分割,如果发生冲突,服务器上的任何内容都具有优先级(以避免让用户解决冲突).由于可能存在大量数据,因此首选部分同步.
对于这种情况是否存在任何模式/良好实践,或者如果您不知道 - 您的方法是什么?
以下是我现在想要解决的问题:与数据并行,将保留修改日志,使所有交易都有时间戳.当客户端连接时,它会以统一的形式接收自上次检查以来的所有更改(服务器遍历列表并删除添加后跟随删除,合并每个原子的更新等).瞧,我们是最新的.
备选方案是保留每条记录的修改日期,而不是执行数据删除,只需将它们标记为已删除即可.
有什么想法吗?
问题:如何获取子上下文以查看父上下文中保留的更改,以便它们触发我的NSFetchedResultsController来更新UI?
这是设置:
你有一个下载并添加大量XML数据的应用程序(大约200万条记录,每条记录大致与正常段落的文本大小相同).sqlite文件的大小约为500 MB.将此内容添加到Core Data需要时间,但您希望用户能够在数据以递增方式加载到数据存储中时使用该应用程序.用户必须看不到大量数据被移动,因此没有挂起,没有抖动:滚动像黄油一样.尽管如此,该应用程序更有用,添加的数据越多,因此我们不能永远等待将数据添加到Core Data存储中.在代码中这意味着我真的想在导入代码中避免这样的代码:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]];
Run Code Online (Sandbox Code Playgroud)
该应用仅限iOS 5,因此需要支持的最慢设备是iPhone 3GS.
以下是我目前用于开发当前解决方案的资源:
iDeveloper TV - 适用于Mac,iPhone和iPad更新的核心数据
我有3个NSManagedObjectContext实例:
masterManagedObjectContext - 这是具有NSPersistentStoreCoordinator的上下文,负责保存到磁盘.我这样做,所以我的保存可以是异步的,因此非常快.我在发布时创建它,如下所示:
masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[masterManagedObjectContext setPersistentStoreCoordinator:coordinator];
Run Code Online (Sandbox Code Playgroud)
mainManagedObjectContext - 这是UI在任何地方使用的上下文.它是masterManagedObjectContext的子代.我像这样创建它:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[mainManagedObjectContext setUndoManager:nil];
[mainManagedObjectContext setParentContext:masterManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)
backgroundContext - 此上下文在我的NSOperation子类中创建,该子类负责将XML数据导入Core Data.我在操作的main方法中创建它并将其链接到那里的主上下文.
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[backgroundContext setUndoManager:nil];
[backgroundContext setParentContext:masterManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)
这实际上非常非常快.只需通过这3个上下文设置,我就可以将导入速度提高10倍以上!老实说,这很难相信.(此基本设计应该是标准Core Data模板的一部分......)
在导入过程中,我保存了两种不同的方式.我在背景上下文中保存的每1000个项目:
BOOL saveSuccess …Run Code Online (Sandbox Code Playgroud) core-data nsfetchedresultscontroller nsmanagedobjectcontext ios