【问题标题】:How to handle offline mode with CoreData and CloudKit?如何使用 CoreData 和 CloudKit 处理离线模式?
【发布时间】:2018-01-13 07:42:44
【问题描述】:

我正在构建一个类似于 Apple 的 Notes 应用程序的简单应用程序,我的应用程序使用 CoreData 和 CloudKit。 目前,我遇到了一些与 CloudKit 的网络可用性相关的问题。

当网络可用时,一切顺利,CoreData 保存笔记,CloudKit 也使用 CKModifyRecordsOperation。但是,当网络不存在时,应用程序会以某种方式保持离线时发送的操作,并在应用程序上线时将它们推送到云端。但是,它只在我创建另一个操作并添加到队列时才会这样做,当应用程序变为活动时它不会自动执行(我将应用程序从后台带到活动模式并等待 5 分钟,什么也没发生。只有当我排队另一个操作,然后所有待处理的操作也被发送)

我的问题是,如何在不创建另一个操作的情况下触发应用发送所有待处理的操作?

当然,如果用户没有杀死应用程序(双主页按钮然后滑动离开),上述情况是可能的。如何处理这种情况?当离线时创建的记录很少,然后应用程序被杀死。

我想标记 CoreData 中成功同步的每条记录,然后每次应用启动时,检查未同步的记录并同步它们。

这是正确的方法吗?还是 Apple 已经有更好的方法来处理这个问题,但我仍然找不到?

【问题讨论】:

    标签: ios swift cloudkit


    【解决方案1】:

    您绝对可以为每个对象保留一个布尔值以将其标记为不同步,然后尝试在启动时或连接恢复时进行同步。

    否则,是否会在您的应用进入后台之前调用 longLivedOperationWasPersistedBlock?如果不是,则表明您的操作未正确持久化。

    根据文档,当您的应用恢复时,您应该获取任何长期存在的操作并将它们添加到容器中:

    container.fetchAllLongLivedOperationIDs(completionHandler: { (operationIDs, error) in
    if let error = error {
        print("Error fetching long lived operations: \(error)")
        // Handle error
        return
    }
    guard let identifiers = operationIDs else { return }
    for operationID in identifiers {
        container.fetchLongLivedOperation(withID: operationID, completionHandler: { (operation, error) in
            if let error = error {
                print("Error fetching operation: \(operationID)\n\(error)")
                // Handle error
                return
            }
            guard let operation = operation else { return }
            // Add callback handlers to operation
            container.add(operation)
        })
    }
    

    })

    【讨论】:

    • 感谢您的回答,实际上我在您回答之前采用了相同的方法,标记那些未同步的对象。但是,由于它对我有用,我会接受这个答案。
    猜你喜欢
    • 2016-02-14
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多