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
}
}];
}
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];
}
}];
}