1

我有某种 CloudKit 索引问题。当我使用 CKModifyRecordsOperation 将记录保存到 iCloud 时,modifyRecordsCompletionBlock 不会返回任何错误。当我使用 NSPredicate(value: true) 或 Dashboard 查询这些记录时,大多数情况下它会丢失一两条记录。

假设我上传了 5 条记录(没有错误),等待一段时间(~15 秒)以确保索引已更新,然后查询它们(通过仪表板或应用程序的 CKQueryOperation)。大多数情况下,它会显示 5 条记录中的 4 条记录。同样,没有错误。记录在 customZone 的 privateDB 中。

奇怪的是:我总是能够通过在“获取”菜单下的仪表板(开发)中手动键入记录名称来获取查询未返回的记录。所以它存储它们,只是不查询。当我删除仪表板中的索引并重新分配它们时,仪表板查询将开始返回所有结果(以前也省略了记录),但是在再上传几次后,查询中又会开始丢失一些结果。

这是我的 CKModifyRecordsOperation:

let operation = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: []) 

operation.modifyRecordsCompletionBlock =
{ [weak self] savedRecords, deletedRecordIDs, error in

   guard error == nil else { // no errors here ... } 
   ...
   //for each item uploaded to iCloud, mark as synced
   if let savedRecords = savedRecords{ // all attempted to save records are here
        PendingCloudOperations.shared.markAsUploaded(
        savedRecords.map{ $0.recordID.recordName })
   }

   completion(...)
}

operation.savePolicy = .changedKeys          // tried .allKeys too
operation.qualityOfService = .userInitiated  

self.privateDB.add(operation)

我尝试了记录字段(最初是日期、资产和参考),试图查看是否有任何字段出现问题。但即使我删除了所有字段(创建一个没有额外字段的记录,只是系统元数据),问题仍然存在。我没有包含 CKQueryOperation 代码,因为 Dashboard 的行为方式与应用程序相同。

有任何想法吗?

编辑:这是我的获取功能的基本内容:

    var receipts:[FS_Receipt] = []

    let query = CKQuery(recordType: myRecordType, predicate: NSPredicate(value: true))
    let operation = CKQueryOperation(query: query)

    //completion block
    operation.queryCompletionBlock = { [weak self] cursor, error in
        guard error == nil else {
            // doesn't have any errors here
        }

        completion(...) 
    }

    operation.recordFetchedBlock = { record in

        // doesn't return all records here most of the time.
    }



    operation.qualityOfService = .userInitiated // without this, 'no internet' will NOT return error

    operation.resultsLimit = 5000 

    operation.zoneID = customZoneID


    self.privateDB.add(operation)
}
4

0 回答 0