如何使用 SwiftUI 从 CloudKit 检索数据
How to retrieve data from CloudKit using SwiftUI
我正在使用 SwiftUI 制作应用程序并将数据存储在 ICloud 上。因为我能找到的所有代码都与 Swift 和 viewDidLoad 和 TableView 相关,但是这不适用。我已经编写了代码并且似乎可以检索它但不会 return 它到 ObservableObject 以便能够在 SwiftUI
中显示
ObservableObject 文件:-
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
查询操作异步运行。当你将操作添加到数据库时,框架在后台运行查询并立即 returns 控制你的函数,它立即 returns data
,它仍然设置为空数组.
要解决此问题,您需要使用 Grand Central Dispatch 等待操作完成(如果直接从 UI 代码调用,则不推荐这样做,因为它会阻塞您的应用程序),或者您需要重写 loadVenues
以便它接受一个回调,然后您可以在 queryCompletionBlock
中调用该回调。您提供给 loadVenues
的回调应该将场地数组保存在 SwiftUI 将检测到变化的地方。
我正在使用 SwiftUI 制作应用程序并将数据存储在 ICloud 上。因为我能找到的所有代码都与 Swift 和 viewDidLoad 和 TableView 相关,但是这不适用。我已经编写了代码并且似乎可以检索它但不会 return 它到 ObservableObject 以便能够在 SwiftUI
中显示ObservableObject 文件:-
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
查询操作异步运行。当你将操作添加到数据库时,框架在后台运行查询并立即 returns 控制你的函数,它立即 returns data
,它仍然设置为空数组.
要解决此问题,您需要使用 Grand Central Dispatch 等待操作完成(如果直接从 UI 代码调用,则不推荐这样做,因为它会阻塞您的应用程序),或者您需要重写 loadVenues
以便它接受一个回调,然后您可以在 queryCompletionBlock
中调用该回调。您提供给 loadVenues
的回调应该将场地数组保存在 SwiftUI 将检测到变化的地方。