如何在iOS

时间:2016-10-19 13:59:56

标签: swift cloudkit

简短摘要

当我

  1. 在我的iPhone上处于飞行模式(没有互联网连接)时创建一个长寿命的CKModifyRecordsOperation
  2. 然后通过双击主页按钮并轻扫应用程序退出创建CKModifyRecordsOperation的应用程序
  3. 禁用飞行模式并通过wifi网络连接到互联网(仍然使用应用程序退出)
  4. 我可以看到(在CloudKit仪表板中)操作已发送到iCloud服务器并正确执行。 但是当我重新打开我的应用程序并在同一个CKContainer上调用fetchAllLongLivedOperationIDs(...)时,我得到(没有错误并且) 0操作列表

    - > 如何检索中创建的操作(1.)

    详细说明

    我在一个简单的CRUD应用程序中尝试使用CloudKit(可以在GitHub上找到source)。该应用程序包含一个macOS应用程序和一个iOS应用程序。这两个应用程序共享大部分CloudKit代码。

    参考文档声明从fetchAllLongLivedOperationIDs调用返回的数组是:

      

    包含所有活动长寿命标识符的数组   操作。如果长期操作被取消或完成,那就是   不再是活动操作,并且不会包含其标识符   在这个数组中。

         

    如果应用成功,操作即告完成   收到完成回调。

    当我添加这样长寿命的操作时(虽然没有连接到互联网):

    let deletion = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: [someRecordID])  
    deletion.isLongLived = true  
    deletion.start()
    

    在我的github上的示例应用程序中可以找到here的代码

    然后退出我的应用,连接到互联网并重新打开我的应用,以下抓取:(GitHub link)

    cloudContainer.fetchAllLongLivedOperationIDs { operationIDs, error in
      if let error = error {print(error)}
      print(operationIDs.count)
    }
    
    当我在iPhone上试用时,

    返回0操作并且没有错误。

    就像我之前说的那样,我也使用与macOS应用程序完全相同的代码。而且令人惊讶的是,在我执行相同的操作时,它在macOS上会返回1次操作。

    好的,所以我想:也许出于某种原因,在iOS中操作完成(这意味着:应用程序成功接收完成回调,如文档中所述),而应用程序未运行(因为我自己退出了)。所以我重复整个序列(在摘要中描述),但是我手动保存了operationID,然后当我重新打开应用程序时,我通过其ID fetchLongLivedOperation(withID: ..., completionHandler: ...)获取操作,以查看操作是否真的在背景。但是,不,我恢复了我的操作,它仍然被标记为活动(或在其debugDescription中编写的未完成)(GitHub link)。 因此,由于某种原因,操作仍处于活动状态,但我无法使用fetchAllLongLivedOperationIDs进行检索。

    这是一个已知的错误还是我做错了什么?

    我正在使用

    • macOS 10.12(16A323)在MacBook Pro 15上“(2013年末)
    • iOS 10.0.1在iPhone 5上

1 个答案:

答案 0 :(得分:2)

看一下你的代码,看起来你没有在长寿命的CKOperations上设置longLivedOperationWasPersistedBlock

根据longLivedOperationWasPersistedBlock documentation

  

如果您的应用在调用此块之前退出,则fetchAllLongLivedOperationIDs(completionHandler:)方法的结果中不会包含长期存在的操作标识符。

如果您在持久存在长期操作之前强制退出应用程序(您目前没有检查 - 我建议指定该块和日志记录),这确实可能导致问题。