CoreData到PersistentCoudKitContainer同步的延迟

问题描述

我的CoreData与NSPersistentCloudKitContainer的iCloud同步出现问题。

同步工作正常,但是当我重新安装该应用程序时,在应用程序启动和同步结束之间会有几秒钟的令人讨厌的延迟。我需要在启动时决定是创建新数据实体还是使用iCloud中的“旧”数据。

如果可以的话,我可以忍受延迟并等待同步完成

a)在启动时确定iCloud中存在要同步的数据,并且

b)最终完成同步时会收到通知

有人知道实现此目标的解决方案吗?设置 NSPersistentStoreRemoteChangeNotificationPostOptionKey并没有多大帮助,因为它在同步期间会触发多次,并且不会提供任何状态信息。

解决方法

冒着为您提供尽可能最无助的答案的风险,我认为这是不可能的,即使是这样,我也认为您正在与window.Closing -= window.Window_Closing 的哲学作斗争。

对于#include <QApplication> #include <QMainWindow> #include <QGraphicsLinearLayout> #include <QGraphicsProxyWidget> #include <QGraphicsView> #include <QPainter> class SimpleItem : public QGraphicsItem { public : explicit SimpleItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) { setFlag(ItemIsSelectable,true); } QRectF boundingRect() const override { return QRectF(-20,-20,40,40); } void paint(QPainter *painter,const QStyleOptionGraphicsItem *,QWidget *) override { painter->setPen(isSelected() ? Qt::red : Qt::black); painter->setBrush(Qt::gray); painter->drawRect(boundingRect()); } }; class SceneItem : public QGraphicsWidget { QGraphicsScene *m_scene; public: explicit SceneItem(QGraphicsItem *parent = nullptr) : QGraphicsWidget(parent),m_scene(new QGraphicsScene(this)) { auto *layout = new QGraphicsLinearLayout; auto *view = new QGraphicsView(m_scene); auto *proxy = new QGraphicsProxyWidget(this); auto *simpleItem = new SimpleItem(this); m_scene->addItem(simpleItem); proxy->setWidget(view); layout->addItem(proxy); setLayout(layout); setFocusPolicy(Qt::ClickFocus); setFlag(QGraphicsItem::ItemIsSelectable,true); } QGraphicsScene *scene() const { return m_scene; } QRectF boundingRect() const override { return QRectF(0,100,100);} void paint(QPainter *painter,QWidget *) override { painter->setPen(isSelected() ? Qt::red : Qt::black); painter->setBrush(Qt::lightGray); painter->drawRect(boundingRect()); } int type() const override { return UserType; } }; int main(int argc,char *argv[]) { QApplication a(argc,argv); QMainWindow w; auto *scene = new QGraphicsScene; auto *view = new QGraphicsView(scene); auto *item = new SceneItem; scene->addItem(item); view->setDragMode(QGraphicsView::RubberBandDrag); QObject::connect(item->scene(),&QGraphicsScene::selectionChanged,[item,scene](){ if (!item->scene()->selectedItems().isEmpty()) scene->clearSelection(); }); QObject::connect(scene,[scene](){ if (scene->selectedItems().isEmpty()) return; for (auto *item : scene->items()) if (item->type() == QGraphicsItem::UserType) static_cast<SceneItem *>(item)->scene()->clearSelection(); }); w.setCentralWidget(view); w.show(); return a.exec(); } ,您应该假定同步以不规则,不稳定的间隔发生或根本没有发生。它应该可以在后台无缝运行,而您无需担心。您不应该尝试在代码发生时或发生时猜测。

这与在iPhone上拍照非常相似,然后花几秒钟的时间将该照片显示在iMac上。 iCloud同步决定是否以及何时进行同步。

我知道这没有帮助,但是我认为您应该了解这种观点。