Search code examples
iosfirebasefirebase-realtime-databasejsqmessagesviewcontroller

Why do 2 messages appear when I press the send button in JSQMessagesViewController


Here is my didpresssend logic - 2 messages appear in the view, but when the page is refreshed, there is actually only 1 message in my message array.

- (void)didPressSendButton:(UIButton *)button withMessageText:(NSString *)text senderId:(NSString *)senderId senderDisplayName:(NSString *)senderDisplayName date:(NSDate *)date {

    JSQMessage *message = [[JSQMessage alloc] initWithSenderId:senderId senderDisplayName:senderDisplayName date:date text:text];

    NSDictionary *firebaseMessage = @{@"avatar":self.avatarURL,@"handle":senderDisplayName,@"message":text,@"profileId":self.profID,@"timestamp":[self getTimestamp]};
    [[self.threadRef childByAutoId] setValue:firebaseMessage withCompletionBlock:^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
        if (!error) {
            [self.messages addObject:message];
            [self finishSendingMessageAnimated:YES];
            [self sendToServer:text];
        } else {
            //Message Failed
        }
    }];
}

Solution

  • It has something to do with the action being performed asyncronously - for now, I can post the message immediately, then remove the message later if the Firebase operation fails:

    But does anybody know why this happens? is it something to do with how JSQMessage data source works?

    - (void)didPressSendButton:(UIButton *)button withMessageText:(NSString *)text senderId:(NSString *)senderId senderDisplayName:(NSString *)senderDisplayName date:(NSDate *)date {
    
        JSQMessage *message = [[JSQMessage alloc] initWithSenderId:senderId senderDisplayName:senderDisplayName date:date text:text];
        [self.messages addObject:message];
        [self finishSendingMessageAnimated:YES];
    
        NSDictionary *firebaseMessage = @{@"avatar":self.avatarURL,@"handle":senderDisplayName,@"message":text,@"profileId":self.profID,@"timestamp":[self getTimestamp]};
        [[self.threadRef childByAutoId] setValue:firebaseMessage withCompletionBlock:^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
            if (!error) {
                [self sendToServer:text];
            } else {
                //Message Failed
                [self.messages removeObject:message];
                [self.collectionView reloadData];
            }
        }];
    }