2014-11-20 33 views
1

我使用PFObject.saveAllInBackground()在我的Parse數據庫中創建了一堆新對象。這些是數據庫中尚不存在的新對象。處理PFObject.saveAll()的部分成功

創建完成後,我需要在我的本地應用數據庫中跟蹤他們的objectId,以便稍後進行更新。

使用saveAll()幾乎是一個需求,循環1000+對象並單獨保存它們是很慢的,它壓倒了Parse後端。

saveAll()的結果是布爾值:它告訴我整個操作是否成功。

但是,當它返回一個失敗(使用NSError對象告訴我出了什麼問題)時,這些對象中的一些已成功在服務器上創建。

在這種情況下,我想知道我的saveAll()批次中的哪些對象已成功創建並檢索它們的objectId,因此當我嘗試再次保存時,我不會複製它們。

所以我的問題是:當PFObject.saveAll()失敗,我怎麼知道哪些對象已成功保存/創建,如果有的話?

回答

0

當您使用saveAllInBackground(與saveInBackground類似)時,Parse會在您想要保存的原始對象上填充objectId。請看下圖:

PFObject *userObject = [PFObject objectWithClassName:@"ClassName"]; 
[PFObject saveAllInBackground:@[userObject] block:^(BOOL succeeded, NSError *error) { 
    NSLog(@"objectID %@", userObject.objectId); //ex: objectID C1w4kGNIfW 
}]; 

另一種方法是通過創建自己的ID:

PFObject *userObject = [PFObject objectWithClassName:@"ClassName"]; 
NSString * uuidCustom = [[NSUUID UUID] UUIDString]; 
userObject[@"uuidCustom"] = uuidCustom; 
[PFObject saveAllInBackground:@[userObject] block:^(BOOL succeeded, NSError *error) { 
    //here make a Parse find using your custom UUIDs and see which one where saved. 
}]; 

更新: 選項1是無效的,因爲解析在這裏提一下: https://parse.com/questions/saveallinbackground-and-deleteallinbackground-results-if-partial-fail

它如果並且只返回YES,如果所有對象都被保存/刪除。如果只有一些或沒有對象成功,則它將返回NO,並且其中一些對象可能已成功,而其他對象則失敗。 所以saveAllInBackground不會執行原子保存。

+0

是的,但是當我保存一批對象並且只有其中一些成功創建時,它們的objectid沒有設置。 – 2014-11-20 23:55:39

+0

自定義的uuid建議很有意思,但是爲了知道保存哪些對象,不得不運行Parse查詢並不是一件好事,考慮到這會在Parse保存命令失敗時發生 - 這可能意味着網絡不良,超過配額,解析超時等...所以查詢失敗的機率很高,我仍然不知道哪些對象已成功創建。 – 2014-11-21 01:12:26

+0

既然你說Parse沒有設置objectID,即使對象被保存在Parse上(這看起來像一個Parse bug,你應該用Parse打開一個bug),你必須確定自己是否保存了對象。所以你需要創建你自己的唯一ID,UUID是一個很好的解決方案。關於超時,您可以創建一個本地數據庫,其中包含要求Parse插入並確認哪些實際保存的記錄,然後再進行另一次保存。我希望這有幫助。 – 2014-11-21 02:24:18