CloudKit 方法调用挂断

CloudKit method call hung up

当应用程序启动时,会发生一些初步过程。有的时候几秒钟就搞定了,有的时候没完没了,但是没报错就挂了。

即在启动客户端总是获取最后一个 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_waitaddOperation才叫?

奇怪的是,该应用程序适用于 iOS 8,此错误仅出现在 iOS 9.

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

queryOperation.qualityOfService = .UserInteractive

在 iOS 9 中,Apple 更改了该设置的行为。特别是在使用蜂窝数据时,您可以获得您描述的行为。

.qualityOfService 的文档指出: 这个 属性 的默认值是 NSOperationQualityOfServiceBackground 并且您应该尽可能保留该值。

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

上报告了