CloudKit не извлекает записи, которые должны быть там и могут быть извлечены
У меня есть функция, которая создает новую запись в CloudKit. Как только эта запись была успешно создана, она вызывает функцию refresh(), которая вызывает другую функцию, которая запрашивает запись, которую я только что создал. Тем не менее, он говорит, что я создал запись, но никогда не входит в следующий запрос, который говорит мне, что новая запись может не достигнуть CloudKit во времени до того, как ее запросят. Кстати, если бы я посмотрел в базе данных, запись была создана правильно.
Создание новой функции записи:
func saveCreatedGroup2(){
let Group = CKRecord(recordType: "Group")
print(groupName)
Group.setObject(groupName as CKRecordValue?, forKey: "groupName")
Group.setObject(groupDesc as CKRecordValue?, forKey: "groupDesc")
Group.setObject(publicOrPrivate as CKRecordValue?, forKey: "PublicOrPrivate")
Group.setObject(members as CKRecordValue?, forKey: "memberUsernames")
Group.setObject(leaders as CKRecordValue?, forKey: "leaders")
database.save(Group) { (savedRecord, error) in
if error != nil{
print(error.debugDescription)
}else{
DispatchQueue.main.async{
print("SAVED RECORD, CREATED NEW GROUP!!!!")
// IT DOES SAY THIS^
thisTeamName = selectedCellName
createdNewGroup = false
self.refresh()
}
}
}
}
функция refresh():
func refresh(){
tempThisGroupTuple = []
sortedTupleArray = []
otherTeam = []
otherSortedArray = []
tempOtherTeamTuple = []
canSwitchViews = false
if (canRefresh == false){
print ("ABANDONED")
refreshControl.endRefreshing()
}else{
loadGroupPage()
DispatchQueue.main.async{
self.requestsTableView.reloadData()
self.groupFeedTableView.reloadData()
}
}
}
Функция loadGroupPage() (запрашивая только что созданную запись) - печатает строку, предшествующую запросу, но не печатает строку, находящуюся внутри запроса!:
func loadGroupPage() {
print("loadingf group pagew...\(thisTeamName)") // PRINTS THIS
let pred = NSPredicate(format: "groupName = %@", thisTeamName)
let query = CKQuery(recordType: "Group", predicate: pred)
let operation = CKQueryOperation(query: query)
operation.qualityOfService = .userInteractive
var canJoin = false
var requestVisible = false
operation.recordFetchedBlock = { (record: CKRecord!) in
if record != nil{
self.OurGroup = record
groupMembs = (record.object(forKey: "memberUsernames") as! Array) // loads group members
print("original groupMembs: \(groupMembs)") // DOES NOT PRINT THIS LINE, SO IT IS TELLING ME IT DID NOT FIND THE RECORD
...(There's more to this function but it's unnecessary)
Я также подтвердил, что когда начинается запрос, предполагается, что предикат /"thisTeamName" будет таким, какой он является, то есть groupName только что созданной записи. Я запутался, почему он не может получить / запросить запись.
1 ответ
Ваша функция обновления вызывает loadGroupPage(), а затем немедленно запускает асинхронный вызов, чтобы перезагрузить таблицы, не дожидаясь завершения функции loadGroupPage, поэтому даже если вы получите запись, я не думаю, что она будет работать должным образом.
Вы не показываете в функции loadGroupPage, где вы фактически добавляете операцию запроса в базу данных. Я предполагаю, что это там?
RecordFetchedBlock будет запускаться один раз для каждой возвращенной записи, вам не нужно принудительно развертывать запись (запись: CKRecord!). Вам также не нужно проверять запись!= Nil, поскольку она гарантированно будет там.
Документы CKQuery recordFetchedBlock говорят:
Предупреждение
Индексы запросов обновляются асинхронно, поэтому они не гарантируют актуальность. Если вы запрашиваете записи, которые вы недавно изменили, и не предоставляете достаточно времени для обработки этих изменений, результаты запроса могут быть неверными. Результаты могут не содержать правильные записи, и записи могут быть не в порядке.
Я ни в коем случае не эксперт (и не использовал удобный API), но встроил синхронизацию в свое приложение и, исходя из своего опыта, я был бы удивлен, если бы проблема заключалась в том, что индекс не обновился.
Я бы порекомендовал добавить в queryCompletionBlock и проверить там ошибки. Вы должны всегда проверять наличие ошибок при использовании CloudKit, потому что даже при правильном коде все равно будут моменты, когда вы будете получать ошибки (сеть недоступна, iCloud не работает и т. Д.)