Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SwiftUI从CloudKit检索数据_Swift_Cloudkit_Swiftui - Fatal编程技术网

如何使用SwiftUI从CloudKit检索数据

如何使用SwiftUI从CloudKit检索数据,swift,cloudkit,swiftui,Swift,Cloudkit,Swiftui,我正在使用SwiftUI制作一个应用程序,并将数据存储在ICloud上。因为我能找到的所有代码都与Swift、viewDidLoad和TableView有关,但是这不适用。我已经编写了代码,似乎正在检索它,但不会将其返回到ObserveObject,以便能够在SwiftUI中显示 ObserveObject文件:- import SwiftUI import Combine final class ObservedData: ObservableObject { @Published

我正在使用SwiftUI制作一个应用程序,并将数据存储在ICloud上。因为我能找到的所有代码都与Swift、viewDidLoad和TableView有关,但是这不适用。我已经编写了代码,似乎正在检索它,但不会将其返回到ObserveObject,以便能够在SwiftUI中显示

ObserveObject文件:-

import SwiftUI
import Combine

final class ObservedData: ObservableObject {
    @Published var venues = venuesData
}
用于检索数据的查询

import SwiftUI
import CloudKit

var venuesData: [Venue] = loadVenues()

func loadVenues() -> [Venue] {

    var data = [Venue]()

    let pred = NSPredicate(value: true)
    let sort = NSSortDescriptor(key: "id", ascending: true)
    let query = CKQuery(recordType: "DeptfordHopData", predicate: pred)
    query.sortDescriptors = [sort]

    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["id","name", "address"]
    operation.resultsLimit = 50

    var newVenues = [Venue]()

    operation.recordFetchedBlock = { record in
        let venue = Venue()
        venue.racordID = record.recordID
        venue.id = record["id"]
        venue.name = record["name"]
        venue.address = record["address"]
        newVenues.append(venue)
    }

    operation.queryCompletionBlock = {(cursor, error) in
        DispatchQueue.main.async {
            if error == nil {
                data = newVenues
            } else {
                print(error!.localizedDescription)
            }
        }
    }

    CKContainer.default().publicCloudDatabase.add(operation)

    return data
}

我得到的数据显示了何时中断数据,但没有传递到venueData,查询操作异步运行。将操作添加到数据库时,框架会在后台运行查询,并立即将控件返回到函数,该函数会立即返回
数据
,该数据仍设置为空数组


要解决此问题,您需要使用Grand Central Dispatch等待操作完成(如果直接从UI代码调用此操作,则不建议这样做,因为它会阻止您的应用程序),或者需要重写
LoadVinces
,以便它接受回调,然后您可以在
queryCompletionBlock
内调用该回调。您提供给加载场馆的回调应将场馆数组保存在SwiftUI将检测到更改的位置。

查询操作异步运行。将操作添加到数据库时,框架会在后台运行查询,并立即将控件返回到函数,该函数会立即返回
数据
,该数据仍设置为空数组

要解决此问题,您需要使用Grand Central Dispatch等待操作完成(如果直接从UI代码调用此操作,则不建议这样做,因为它会阻止您的应用程序),或者需要重写
LoadVinces
,以便它接受回调,然后您可以在
queryCompletionBlock
内调用该回调。您提供给
LoadVinces
的回调应该将场馆数组保存在SwiftUI将检测到更改的位置