Полученные данные из частной базы данных CloudKit не возвращаются из функции

Я пытаюсь получить некоторые данные из частной базы данных ClouKit. Запрос и предикат работают нормально, потому что я вижу в print(data) // 1, что массив заполнен всеми данными. Но как только он уходит perform(){}, массив сбрасывается до верхних определенных значений и просто возвращает их.

func fetchUserRecord() -> [Double] {
    var data: [Double] = [0, 1, 2]                              //demo data
    let aWeekAgo = Date().addingTimeInterval(-604800)
    
    let privateDB = CKContainer.default().privateCloudDatabase
    let predicate = NSPredicate(format: "Date > %@", aWeekAgo as NSDate)
    let query = CKQuery(recordType: "ProgressionValue", predicate: predicate)

    privateDB.perform(query, inZoneWith: nil) { records, error in
        guard let records = records else { return }
        for record in records {
            data.append(record["Value"] as! Double)
        }
        data.append(0.0)
        print(data)         // 1
    }
    print(data)             // 2
    return data
}

Вот результаты:

печать (данные) //1: [0.0, 1.0, 2.0, {тонн двойников}, 0.0]

печать (данные) // 2: [0,0, 1,0, 2,0]

Что мне не хватает?

//1 следует печатать после //2, не так ли? Вам не хватает асинхронности perform(query:inZoneWith:completion:). Вам нужно использовать замыкание.

Larme 04.05.2022 22:43

Спасибо @Larme, я определенно пропустил это, я также впервые работаю с асинхронными вызовами. Я прочитаю что-нибудь об этом и обновлю этот пост, как только выясню это. Большое вам спасибо за вашу помощь!

olvrwn 05.05.2022 13:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте новые инструменты синхронизации;

 func fetchUserRecord() async throws -> [Double]
 {
     var data: [Double] = [0, 1, 2]    // you don't really want the              
     let aWeekAgo = Date().addingTimeInterval(-604800)

    let privateDB = CKContainer.default().privateCloudDatabase
    let predicate = NSPredicate(format: "Date > %@", aWeekAgo as NSDate)
    let query = CKQuery(recordType: "ProgressionValue", predicate: predicate)
    let (values, cursor) = try await privateDB.records(matching: query, resultsLimit: 100)

    for r in values
    {
        if let rec = try? r.1.get()
        {                
            data.append(rec["value"] as Double)
        }
    }
    
    return x
        
  }

Назовите это так;

Task 
{
   do {
         data = try await fetchUserRecord()           
      }
      catch
      {
         print(error)
      }
 }

Другие вопросы по теме