CloudKit 方法调用挂断

Posted

技术标签:

【中文标题】CloudKit 方法调用挂断【英文标题】:CloudKit method call hung up 【发布时间】:2015-10-05 16:51:20 【问题描述】:

当应用启动时,会发生一些初步过程。有的时候很快就搞定了,有的时候没有结束,但是没有任何错误就挂了。

即在启动客户端总是获取最后一个serverChangedToken。有时它只是挂断它没有完成。我说的是生产环境,开发人员工作得很好。所以这条路线被调用,但有时它没有完成。知道为什么吗?我没有收到任何错误,超时。

let fnco = CKFetchNotificationChangesOperation(previousServerChangeToken: nil)
fnco.fetchNotificationChangesCompletionBlock = newServerChangeToken, error in

    if error == nil 

        serverChangeToken = newServerChangeToken

        dispatch_sync(dispatch_get_main_queue(), 

            (colorCodesInUtility.subviews[10] ).hidden = false
        )

     else 

        Utility.writeMessageToLog("error 4559: \(error!.localizedDescription)")
    

    dispatch_semaphore_signal(sema)


defaultContainer.addOperation(fnco)
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)

我知道不建议使用信号量来控制 CloudKit 方法调用的流程。

你认为最后两行可以交换吗?先调用dispatch_semaphore_wait,再调用addOperation

奇怪的是,该应用适用于 ios 8,这个错误只出现在 iOS 9 中。

【问题讨论】:

【参考方案1】:

添加以下代码行可能会解决您的问题:

queryOperation.qualityOfService = .UserInteractive

在 iOS 9 中,Apple 更改了该设置的行为。尤其是在使用蜂窝数据时,您可能会得到您所描述的行为。

.qualityOfService 的文档状态如下: 此属性的默认值为 NSOperationQualityOfServiceBackground,您应该尽可能保留该值。

在我看来,这更像是一个 CloudKit 错误,而不是一个改变的功能。更多的人有同样的问题。我已经在https://bugreport.apple.com 报告了它

【讨论】:

***.com/questions/32493698/…也讨论过类似情况 实际上我对 qos NSOperationQualityOfServiceUserInitiated 有很好的体验,因为这不会阻塞 UI,但仍然很快。

以上是关于CloudKit 方法调用挂断的主要内容,如果未能解决你的问题,请参考以下文章

android 自动拨打电话和挂断电话(反射和intent方式)

android 自动拨打电话和挂断电话(反射和intent方式)

CloudKit 操作在开发版本中执行,但有时在生产版本中挂起

多个 API 调用的 Node Js 中的套接字挂断错误

添加 CloudKit 记录时未调用 didReceiveRemoteNotification

Cloudkit + 核心数据不同步