我正在使用 ParseSwift 更新 iOS 應用程式。通常,應用程式的每個 ParseUser 都有幾個需要查詢或獲取的關聯 Userdata ParseObjects。
當前的實作使用單獨的查詢一個接一個地查找每個單獨的 Userdata 物件。這可行,但顯然不是最佳的。
我已經修改的是每個 ParseUser 現在都保存了一個與用戶相關的 Userdata ParseObjects 的 objectId 陣列。
我現在想要實作的是在 ParseUser 的 userdataIds 欄位中查詢與這些保存的 objectId 對應的所有 Userdata 物件。
這是我的代碼:
func asyncAllUserdataFromServer() {
let userdataIdArray = User.current!.userdataIds
var objectsToBeFetched = [Userdata]()
userdataIdArray?.forEach({ objectId in
let stringObjectId = objectId as String
// create a dummy Userdata ParseObject with stringObjectId
let object = Userdata(objectId: stringObjectId)
// add that object to array of Userdata objects that need to be fetched
objectsToBeFetched.append(object)
})
// fetch all objects in one server request
objectsToBeFetched.fetchAll { result in
switch result {
case .success(let fetchedData):
// --- at this point, fetchedData is a ParseError ---
// --- here I want to loop over all fetched Userdata objects ---
case .failure(let error):
...
}
}
}
我在 ParseSwift 檔案中讀到,可以根據它們的 objectIds 同時獲取多個物件,所以我的想法是創建一個包含要獲取的 objectIds 的虛擬 Userdata 物件陣列。然而,這行不通。
如代碼塊中所示,我能夠縮小錯誤范圍,并且在執行查詢時,fetchedData作為一種ParseError說法回來:
Error fetching individual object: ParseError code=101 error=objectId "y55wmfYTtT" was not found in className "Userdata"
這個具有該 objectId 的 Userdata 物件是保存在 User.current.userdataIds 陣列中的第一個(也是唯一的)objectId。這個物件確實存在于我的服務器上,我肯定知道。
任何想法為什么它無法獲取?
一般資訊:
- Xcode 13.2.1
- 斯威夫特 5
- ParseSwift 2.5.0
- Back4App 后端
編輯:
用戶實作:
struct User: ParseUser {
//: These are required by `ParseObject`.
var objectId: String?
var createdAt: Date?
var updatedAt: Date?
var ACL: ParseACL?
//: These are required by `ParseUser`.
var username: String?
var email: String?
var emailVerified: Bool?
var password: String?
var authData: [String: [String: String]?]?
//: Custom keys.
var userdataIds: [String]? // --> array of Userdata objectId's
}
用戶資料實作:
struct Userdata: ParseObject, ParseObjectMutable {
var objectId: String?
var createdAt: Date?
var updatedAt: Date?
var ACL: ParseACL?
var firstname: String?
var lastSeen: Int64?
var isLoggedIn: Bool?
var profilepicture: ParseFile?
}
uj5u.com熱心網友回復:
您應該檢查你的職業等級權限(CLP的)和這里的決議儀表板,如果你使用的是默認的配置,您無法查詢_User類,除非你做出CLP的公共或授權。此外,您可以通過使用查詢和查找物件而不是構建用戶物件并獲取您正在執行的方式來縮小代碼:
let userdataIdArray = User.current!.userdataIds
let query = Userdata.query(containedIn(key: "objectId", array: userdataIdArray))
//Completion block
query.find { result in
switch result {
case .success(let usersFound):
...
case .failure(let error):
...
}
}
// Async/await
do {
let usersFound = try await query.find()
...
} catch {
...
}
您還應該查看您的服務器設定以確保此選項正在執行您希望它執行的操作:https : //github.com/parse-community/parse-server/blob/4c29d4d23b67e4abaf25803fe71cae47ce1b5957/src/Options/docs.js# L31
uj5u.com熱心網友回復:
您確定 UserData 的物件 ID 與用戶 ID 相同嗎?雖然您可能在類中有用戶 ID,但它可能不是 objectId,而是其他一些存盤欄位。
正在做
let query = PFQuery(className:"UserData")
query.whereKey("userId", containedIn:userdataIdArray)
query.findObjectsInBackground { (objects: [PFObject]?, error: Error?) in
// do stuff
}
可能會有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405336.html
標籤:
