我正在开发一个使用Parse作为服务器后端的iOS项目。作为我的代码的一部分,我有以下saveInBackgroundWithBlock嵌套块。
// Save PFFile
[imageFile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
...
[userPhoto saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (!error) {
self.profileDictionary[@"picture"] = userPhoto;
NSLog(@"%@", self.profileDictionary);
NSMutableDictionary *userProfile = self.profileDictionary;
[[PFUser currentUser] setObject:userProfile forKey:@"profile"];
[[PFUser currentUser] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (!error) {
NSLog(@"Saving User Profile Succeded\n\n\n\n");
// If user's info is saved, then let's just segue to the actual app
[self performSegueWithIdentifier:@"profileToMain" sender:self];
} else {
// Log details of the failure
NSLog(@"Error while saving profile: %@ %@", error, [error userInfo]);
}
}];
} else {
// Log details of the failure
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
}];
如您所见,代码主要是嵌套在一起的3个saveInBackgroundWithBlock:
块。
一切正常,直到第三个区块,它只是挂起。我知道这是因为没有执行segue。
代码的主要思想是一个接一个地保存。换句话说,imageFile是先保存的PFFile
,然后保存userPhoto PFObject
,最后预先填充的userProfile会与新{{1}一起保存作为其中的一部分。这个档案。
有关为什么会挂起的任何评论?如何在不导致挂起的情况下实现将对象保存到Parse的连续性?
我事先感谢你的帮助和时间。
答案 0 :(得分:3)
有时对我来说有效的嵌套是PFObject SaveAll功能,你可以传入一个对象数组,按照它们在数组中出现的顺序保存,然后它们都会保存,你仍然可以执行嵌套的块代码一旦它们都成功了。
[PFObject saveAllInBackground:@[Object1, Object2] block:^(BOOL succeeded, NSError *error) {
if(succeeded){
//Your code to execute once finished
}
}