我一直在使用Core Data将iOS应用数据存储在SQLite数据库中。在登录期间或n
分钟过后,数据也会同步到中央服务器,随着应用程序的增长,同步速度变慢,需要后台进程来防止冻结主线程。
为此,我重写了我的Synchronization类,以便为同步方法中的每个进程使用NSInvocationOperation
类。我使用依赖项,因为导入/同步的数据有几个依赖关系。
然后我将所有操作添加到NSOperationQueue
并让它运行。
还有两个重要元素:
当我生成要执行的操作时,我还创建一个新的UUID NSString,它代表一个同步ID。这用于跟踪核心数据中的哪些实体已同步,因此,每个实体都具有存储此同步ID的属性。它仅在同步过程中使用,并且是通过传递给NSInvocationOperation
的每个方法的访问。
导入和同步方法是访问Core Data的实际方法。在每个方法中,我创建了一个NSManagedObjectContext
的新实例,如下所示:
PHAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[privateContext setParentContext:[appDelegate mainManagedObjectContext]];
使用NSPrivateQueueConcurrencyType
而不是AppRlegate中用于主MOC的NSMainQueueConcurrencyType
。然后我使用主线程中的MOC创建父/子关系。保存子MOC时,我理解更改会传播回主MOC和商店(SQLite)。
我对iOS中的并发性相当新,并用它来指导我:http://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131(参见策略#2)。 与本文以及我见过的许多其他来源不同,我没有NSOperation的子类。相反,我的方法使用NSInvocationOperation来传递我想要并发运行的每个方法。
我的问题:您能看看我的代码,看看您是否发现了我做错的事情,或者您认为这会有效吗?到目前为止,我在运行代码时没有遇到任何问题。但并发性很难调试,因此在我们发布此代码之前,我希望有更多经验丰富的眼睛。
提前致谢!
pastebin.com上的同步类代码:http://pastebin.com/CUzWw4Tv (并非所有内容都在代码粘贴中,但它应该足以评估该过程,如果您需要更多,请告诉我)