Rafael Ruiz Muñoz
Rafael Ruiz Muñoz

Reputation: 5472

saveInBackgroundWithBlock not calling the block when it finished working

I'm trying to do a simple chat in iOS with Obj-C, and when I press the "send" button, I save the object into Parse and I retrieve all the messages.

When it succeeds, I retrieve all the messages so the last one (mine) should be retrieved as well, but the last one never gets called. What should I do?

This is my code:

NSMutableArray *messagesArray;

- (IBAction)sendButtonTapped:(id)sender {

    self.sendButton.enabled = false;
    self.textField.enabled = false;
    PFObject *objectChat = [PFObject objectWithClassName: @"ChatClass"];

    objectChat[@"text"] = self.textField.text;

    [objectChat saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {


        self.sendButton.enabled = true;
        self.textField.enabled = true;

        if (succeeded) {
            self.textField.text = @"";

            [self retrieveMessages];

            NSLog(@"success!");
        } else {
            NSLog(error.description);
        }

    }];


}

-(void) retrieveMessages {
    NSDate *now = [NSDate date];

    PFQuery *query = [PFQuery queryWithClassName:@"ChatClass"];
    [query whereKey:@"createdAt" lessThanOrEqualTo:now];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {


        if (error == nil) {

            messagesArray = [[NSMutableArray alloc] init];

            for (int i = 0; i < [objects count]; i++) {

                [messagesArray addObject:[[objects objectAtIndex:i] objectForKey:@"text"]];
            }

            runOnMainQueueWithoutDeadlocking(^{

                [self.messageTableView reloadData];

            });

        }

    }];
}

void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_async(dispatch_get_main_queue(), block);
    }
}

Thank you very much in advance. Regards.

Upvotes: 1

Views: 239

Answers (1)

danh
danh

Reputation: 62676

Perhaps there's enough of a clock difference with the parse server that the time qualification misses the object just created. Removing that line should do the trick.

Upvotes: 2

Related Questions