1

考虑这个简单的方法:

- (void)connectSpouseToCurrentUser:(PFUser *)spouse completionBlock:(void (^)(NSError *error))completionBlock {
    [PFUser currentUser][@"spouse"] = spouse;        
    [[PFUser currentUser] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", [error userInfo]);
        }

        spouse[@"spouse"] = [PFUser currentUser];
        [spouse saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
           // This code never executes
            NSLog(@"Error: %@", error);
            self.spouse = spouse;
            if (completionBlock) {
                completionBlock(error);
            }
        }];
    }];
}

由于某些原因,我最新的完成块没有被调用。

有谁知道为什么会这样?

4

3 回答 3

1

对于使用 Array 列类型的一对多关系遇到此问题的人,

如果将数组分配给 Array 列类型,则不会调用完成块。但是,数据已保存。但是,无法在 parse.com 仪表板中可视化连接。

我有两个表,用户和教育。一个用户可以有多个教育对象。在以下代码中,从不调用完成块。

import Parse

var education : [MyEducation] = [MyEducation]()

let edu1 : MyEducation = MyEducation()
edu1["schoolName"] = "Stanford"
edu1["fieldOfStudy"] = "Engineering"
edu1["startDate"] = NSDate()
education.append(edu1)

let edu2 : MyEducation = MyEducation()
edu2["schoolName"] = "UCLA"
edu2["fieldOfStudy"] = "Data Science"
edu2["startDate"] = NSDate()
education.append(edu2)

PFUser.currentUser()?["education"] = education
PFUser.currentUser()?.saveInBackgroundWithBlock{(success: Bool, error: NSError?) -> Void in
        let a : Int = 1
}

但是,如果您编写以下代码,则会调用完成块。

import Parse

var education : [MyEducation] = [MyEducation]()

let edu1 : MyEducation = MyEducation()
edu1["schoolName"] = "Stanford"
edu1["fieldOfStudy"] = "Engineering"
edu1["startDate"] = NSDate()
edu1["user"] = PFUser.currentUser()
education.append(edu1)

let edu2 : MyEducation = MyEducation()
edu2["schoolName"] = "UCLA"
edu2["fieldOfStudy"] = "Data Science"
edu2["startDate"] = NSDate()
edu2.["user"] = PFUser.currentUser()
education.append(edu2)

PFUser.currentUser()?.saveInBackgroundWithBlock{(success: Bool, error: NSError?) -> Void in
        let a : Int = 1
}

所以最后,选择哪种方法是你的决定。前者使仪表板中的可视化更难(或不可能?),但您可以稍后使用 includeKey("education") 进行 PFUser 查询。

在后一种方法中,您必须查询 Education 类以获取完整的 PFObject,但 Education 类中指向 User 的指针在仪表板中可见,并且正在调用完成块。

我认为 Parse 没有很好地设计关系获取,并且没有记录这种行为。

于 2016-03-31T02:36:15.540 回答
0

我有同样的问题,我在解析助手论坛上只发现了一条关于这个主题的有用评论。我试了一下,效果很好。https://www.parse.com/questions/saveinbackgroundwithblock-not-being-call-on-1219

所以主要的问题是你创建了一个从用户到配偶以及从配偶到用户的指针。我知道使用两个指针更容易。

就我而言,我有用户和消息,所有消息都有指向用户的指针,所有用户都有指向最后一条消息的指针。我删除了最后一个。当我需要一个新消息并将其存储为正常的目标 c 属性时,我查询来自 parse 的最后一条消息,而不是指针。

PFQuery *messageQuery = [Message query];
[messageQuery whereKey:@"owner" equalTo:self.createdBy];
[messageQuery orderByDescending:@"createdAt"];
[messageQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
    if (object && !error)
    self.user.lastMessage = (Message *)object;
}];

希望这会帮助你。此外,我强烈建议您使用用户解析子类化。编码要容易得多,并且可以很好地了解您正在做的事情。

于 2015-02-14T05:51:29.957 回答
0

您应该将代码设置在成功或 !error 块中,如下所示:

if (succeeded) { // like this
    spouse[@"spouse"] = [PFUser currentUser];
    [spouse saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) { // or like this
           // This code never executes
            NSLog(@"Error: %@", error);
            self.spouse = spouse;
            if (completionBlock) {
                completionBlock(error);
            }
        }
    }];
}
于 2014-10-24T03:27:31.237 回答