【问题标题】:CloudKit Cursor Error and Failing to Return all Rows - Encountered an error fetching recordsCloudKit 光标错误和无法返回所有行 - 获取记录时遇到错误
【发布时间】:2017-06-03 23:08:45
【问题描述】:

我正在尝试从 CloudKit 数据库表中检索所有记录,以便与数组进行比较。当我从 CloudKit 进行查询时,出现一般错误。我通常会拿回一些记录,但不是全套。该表只有大约 6500 条记录。使用 true 的谓词,即没有谓词,我得到同样的错误。每次出错前返回的行数都不一样。

完全错误:

<CKQuery: 0x618000423e40; recordType=ActionFigureSale, predicate=saleEndTime > CAST(422923500.000000, "NSDate")> errored for <CKError 0x60000085b6c0: "Internal Error" (1/1000); "Encountered an error fetching records">

我尝试将 resultLimit 设置为 1000,但由于它多次排队,所以多次收到相同的错误。

        let publicDatabase = SharedData.sharedInstance.publicDatabase

        // let predicate = NSPredicate(value: true)
        let predicate = NSPredicate(format: "\(kSaleEndTime) > %@", saleEndTime)
        let query = CKQuery(recordType: kActionFigureSaleRecord, predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: kSaleSourceUniqueId, ascending: true)]

        var queryOperation = CKQueryOperation(query: query)
        queryOperation.queuePriority = .veryHigh
        queryOperation.resultsLimit = 10000

        var actionFigureItemSaleCloudRecordArray = Array<CKRecord>()
        var actionFigureItemSaleCloudArray = Array<ItemSale>()

        queryOperation.recordFetchedBlock = { (record) -> Void in
            actionFigureItemSaleCloudRecordArray.append(record)

            let actionFigureReference = record.object(forKey: kActionFigureReference) as! CKReference

            ...

            actionFigureItemSaleCloudArray.append(itemSaleItemCloud)
        }

        queryOperation.queryCompletionBlock = { (cursor, error) -> Void in

            if error != nil {
                DispatchQueue.main.async {
                    #if DEBUG
                        print("WARNING:  Action Figure Sale iCloud query \(query) errored for \(error!)")
                    #endif

                    completion(nil, error)
                    return
                }
            }

            if cursor != nil {
                let newQueryOperation = CKQueryOperation(cursor: cursor!)
                newQueryOperation.cursor = cursor
                newQueryOperation.resultsLimit = queryOperation.resultsLimit
                newQueryOperation.queryCompletionBlock = queryOperation.queryCompletionBlock

                queryOperation = newQueryOperation

                publicDatabase!.add(queryOperation)
                return

            }
            else {
                completion(actionFigureItemSaleCloudArray, nil)
                return
            }
        }

        publicDatabase!.add(queryOperation)
    }

【问题讨论】:

    标签: core-data swift3 fetch


    【解决方案1】:

    我遇到了同样的错误,我可以通过查看嵌套在 CKError 中的 userInfo 来解决这个问题。下面的代码是我在 queryCompletionBlock 中完成处理程序的一部分:

    if error is CKError {
        let ckerror = error as! CKError
        let info = ckerror.userInfo
        for inf in info {
            NSLog("User-Info:\(inf.key):\(inf.value)")
        }
        NSLog(error!.localizedDescription)
    }
    

    结果表明,我的 queryOperation.resultsLimit 的初始大小太高了。我将它降低到 400 并且错误消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多