0

当我的应用程序启动时,它会将一组实体与服务器同步。在此同步期间,它会更新核心数据中的实体并将其保存。如果您打开应用程序(同步开始),然后我按下应该显示 tableView(带有 NSFetchedResultsController)的标签栏按钮,它会冻结片刻。

我真的不知道在哪里寻找问题。

更新一些额外的信息:

我正在使用一个主(父)上下文,用于获取 NSFetchedResultsController 和同步类中用于下载和保存更改的 chil 上下文。

完成所有更改后,我一个接一个地保存子上下文和父(主)上下文。(我认为这是必要的。)。

4

2 回答 2

2

我从您的陈述中假设您的主要上下文是这样创建的

let mainContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
    mainContext.persistentStoreCoordinator = CoreDatStack.sharedStack.persistentStoreCoordinator

您已经创建了子上下文,如下所示

let childContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
    childContext.parent = mainContext

冻结的原因:您的 mainContext 保存操作在 MainThread 上执行(因为写入磁盘(持久存储)是缓慢的过程),因此阻塞主线程直到保存操作完成。

解决方案:在 privateQueue 上创建与 PersistentStoreCoordinator 链接的上下文,这样保存就不会在 Main Queue 上执行。

于 2017-11-28T20:04:32.887 回答
0

在 viewDidLoad 添加如下内容:

dispatch_queue_t jsonParsingQueue = dispatch_queue_create("jsonParsingQueue", NULL);

// execute a task on that queue asynchronously
dispatch_async(jsonParsingQueue, ^{

    //fetch code here


    // some code on a main thread (delegates, notifications, UI updates...)
    dispatch_async(dispatch_get_main_queue(), ^{

     //UI updates here



    });
});
于 2013-11-14T14:28:48.903 回答