CKError: el filter de consulta supera el límite de valores: 250 para contenedor

Quiero networkingucir alnetworkingedor de 500 loggings de "Visita" de la database pública. CloudKit solo te da 100 loggings a la vez, así que solo utilizo el CKQueryCursor como a continuación para get todos los loggings que quiero.

func fetchVisits(_ cursor: CKQueryCursor? = nil) { print("fetchVisits \(cursor)") var operation: CKQueryOperation! if let cursor = cursor { operation = CKQueryOperation(cursor: cursor) } else { let query = CKQuery(recordType: "Visit", pnetworkingicate: NSPnetworkingicate(format: "Client IN %@ AND ANY Students IN %@", visitClients, visitStudents)) operation = CKQueryOperation(query: query) } operation.recordFetchedBlock = { (record) in totalVisits.append(record) } operation.queryCompletionBlock = { (cursor, error) in if let error = error { //handle error } else if let cursor = cursor { self.fetchVisits(cursor) } else { //all done! } } CKContainer.default().publicCloudDatabase.add(operation) } 

Llamo a la function como:

 fetchVisits() 

Eso funciona bien, recibe todas las visitas que necesito. Registro de la console

 fetchVisits nil fetchVisits Optional(<CKQueryCursor: 0x174228140; id=4bb7887c326fc719, zone=(null)>) fetchVisits Optional(<CKQueryCursor: 0x17422a320; id=f67fb25669486da9, zone=(null)>) fetchVisits Optional(<CKQueryCursor: 0x174228380; id=7e87eb8b7cfe1a74, zone=(null)>) fetchVisits Optional(<CKQueryCursor: 0x17422cc80; id=e77e47ef2b29c8a4, zone=(null)>) 

Pero el problema ahora es que quiero actualizar cuando presiono un button y ahora me da este error:

"Servicio no disponible" (6/2022); "La request falló con el código de estado http 503"; Vuelva a intentarlo después de 30.0 segundos

¿Qué es bastante explicativo, supongo que estoy abrumando al server solicitando 500 loggings míseros? Así que espero 30 segundos e invoco nuevamente la function y ahora obtengo este error.

"Límite superado" (27/2023); server message = "El filter de consulta supera el límite de valores: 250 para contenedor

Por alguna razón, no puedo ejecutar esa function nuevamente. Si reinicio la aplicación funciona bien nuevamente pero solo la primera vez. Este problema parece ser específico para cualquier tabla que devuelva un CKQueryCursor. Tengo otras tablas con las que estoy tocando que tienen less de 100 loggings (por lo que el cursor es nulo) y puedo sacar esas múltiples veces sin problemas.

Ok, así que he visto esto antes y el problema es, creo, un error en los serveres de CloudKit. En mi experiencia, tiene que ver con consultas complejas.

Si intentas cambiar tu pnetworkingicado a:

 NSPnetworkingicate(value: true) 

O incluso simplificando su existente eliminando CUALQUIER parte, eso puede ser suficiente para solucionarlo.

Está solicitando más CKRecords a iCloud antes de que finalice su operación de consulta.

 ... operation.queryCompletionBlock = { (cursor, error) in if let error = error { //handle error } else if let cursor = cursor { self.fetchVisits(cursor) } else { //all done! } } ... 

La function self.fetchVisits(cursor) llamada se realiza dentro del bloque de finalización, esto significa que está solicitando más loggings antes de que su operación actual haya finalizado.

La posible solución es utilizar un cierre (completionHandler) en el que se incluye el CKQueryCursor, cuando el usuario necesita más loggings (desplácese por una tabla o lo que sea), vuelve a llamar a uno self.fetchVisits pasa los cursos recibidos en su cierre.