父数据/子关系和NSInvocationOperation完成的核心数据并发?

时间:2015-06-04 17:49:45

标签: ios objective-c multithreading core-data concurrency

我一直在使用Core Data将iOS应用数据存储在SQLite数据库中。在登录期间或n分钟过后,数据也会同步到中央服务器,随着应用程序的增长,同步速度变慢,需要后台进程来防止冻结主线程。

为此,我重写了我的Synchronization类,以便为同步方法中的每个进程使用NSInvocationOperation类。我使用依赖项,因为导入/同步的数据有几个依赖关系。

然后我将所有操作添加到NSOperationQueue并让它运行。

还有两个重要元素:

  1. 当我生成要执行的操作时,我还创建一个新的UUID NSString,它代表一个同步ID。这用于跟踪核心数据中的哪些实体已同步,因此,每个实体都具有存储此同步ID的属性。它仅在同步过程中使用,并且是通过传递给NSInvocationOperation的每个方法的访问。

  2. 导入和同步方法是访问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)。

  3. 我对iOS中的并发性相当新,并用它来指导我:http://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131(参见策略#2)。 与本文以及我见过的许多其他来源不同,我没有NSOperation的子类。相反,我的方法使用NSInvocationOperation来传递我想要并发运行的每个方法。

    我的问题:您能看看我的代码,看看您是否发现了我做错的事情,或者您认为这会有效吗?到目前为止,我在运行代码时没有遇到任何问题。但并发性很难调试,因此在我们发布此代码之前,我希望有更多经验丰富的眼睛。

    提前致谢!

    pastebin.com上的同步类代码:http://pastebin.com/CUzWw4Tv (并非所有内容都在代码粘贴中,但它应该足以评估该过程,如果您需要更多,请告诉我)

0 个答案:

没有答案