问题描述
我的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同步决定是否以及何时进行同步。
我知道这没有帮助,但是我认为您应该了解这种观点。