Сообщения, удаленные в комнате чата, снова появляются после повторного входа в комнату чата

#ios #objective-c #sqlite #nsarray #nsdictionary

#iOS #objective-c #sqlite #nsarray #nsdictionary

Вопрос:

Приведенный ниже код запускается, когда я нажимаю кнопку удаления после выбора сообщений, которые я хочу удалить в комнате чата.

 - (void)deleteButtonPressed:(id)sender {

    if (arrayToDelete.count) {
        for (NSString *str in arrayToDelete) {
            NSLog(@"msgID --> %@",str);

            [self.chatModel.dataSource removeObject:str]; //??? Remove data from the screen

            [[FMDBManager sharedInstance] deleteMessageByMessageId:str]; //??? Delete data from database

        }
        [arrayToDelete removeAllObjects];
        [self.chatTableView reloadData];
    }

}
  

Эта строка успешно удаляет выбранные сообщения из комнаты чата.

 [self.chatModel.dataSource removeObject:str]; //??? Remove data from the screen
  

Когда я выхожу из комнаты чата и повторно вхожу, эти сообщения все еще существуют, поэтому у меня есть эта строка ниже.

 [[FMDBManager sharedInstance] deleteMessageByMessageId:str]; //??? Delete data from database
  

Я думаю, что приведенная выше строка должна удалить эти выбранные сообщения из базы данных, но когда я снова захожу в комнату чата, я все еще вижу эти сообщения. Ниже приведен соответствующий код.

 - (void)deleteMessageByMessageId:(NSString *)messageId {
    FMDatabase *db = [self getterDataBase];
    [db open];

    NSString *sqlString = [NSString stringWithFormat:@"DELETE FROM message WHERE messageId = '%@'",messageId];
    BOOL status = [db executeUpdate:sqlString];
    NSLog(@"Delete MessageById:%@ Status:%d",messageId,status);
    [db close];
}
  

Я обнаружил, что когда комната чата вызывает viewDidLoad, она в конечном итоге вызывает метод callBackGetChannelLogNew, где сервер синхронизирует данные с tableview комнаты чата и локальной базой данных.

 - (void)callBackGetChannelLogNew:(NSDictionary *)resultDataDic status:(enumAPI_STATUS)eAPI_STATUS {

    if (isFirstTimeUpdate) {

    }

    if (eAPI_STATUS == API_STATUS_SUCCEE) {

        NSString *readString=[NSString stringWithFormat:@"%@",resultDataDic[@"read_arr"]];

        if ([readString isEqualToString:@""]) {

            // NSLog(@"read_arr is empty");
        }

        else {
            NSArray *read_arr=resultDataDic[@"read_arr"];
            // Copy read_arr
            self.readArray=[read_arr mutableCopy];
                     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{
                [self dealWithReadArray:read_arr];
            });
        }
        NSArray *data = [resultDataDic objectForKey:@"msg"];
        if (data.count > 0) {
            apiHaveData = YES;
        } else {
            apiHaveData = NO;
            self.loadIngView.hidden = YES;
            isLoadingData = NO;
            return;
        }
                   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{

            // Reverse order of data
            NSArray* reversedArray = [[data reverseObjectEnumerator] allObjects];
            NSMutableArray *messageFromOtherArray = [NSMutableArray new];
            NSMutableArray *messageAllArray = [NSMutableArray new];

            for (int i = 0; i < reversedArray.count; i  ) {
                NSDictionary *_dic = reversedArray[i];

                NSString *fromId = [_dic objectForKey:@"fid"];

                NSString *message = [NSString stringWithFormat:@"%@",[_dic objectForKey:@"say"]];

                if ([ObjectManager getChatMessageKindWithString:message] == MessageTypeText) {
                    message = [ObjectManager decryptWithString:message];
                }

                NSString *messageId = [_dic objectForKey:@"mid"];
                NSString *toId = [_dic objectForKey:@"tid"];
                NSDateFormatter *_formatter = [[NSDateFormatter alloc] init];
                _formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS";
                NSDate *date_t = [NSDate dateWithTimeIntervalSince1970:[[_dic objectForKey:@"t"] doubleValue]/1000.0]; //換算成日期
                NSString *stringDate = [_formatter stringFromDate:date_t];

                NSString *sendDate = stringDate;
                NSString *lid = _dic[@"lid"];

                NSMutableDictionary *myDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                              fromId,@"fromId",
                                              message,@"message",
                                              messageId,@"messageId",
                                              sendDate,@"sendDate",
                                              toId,@"toId",
                                              lid,@"lid",
                                              nil];
                NSString *isRead;
                if (_chatRoomType == ChatRoomTypePrivate) {
                    if ([_dic[@"r"] intValue]) {
                        isRead = @"1";
                        myDic[@"isRead"] = isRead;
                        lastReadMessageId = [NSString stringWithFormat:@"%@",messageId];
                    }
                }

                if (i == 0) {
                    if (lidForAPI != [_dic[@"lid"] intValue]) {
                        lidForAPI = [_dic[@"lid"] intValue];
                    } else {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            apiHaveData = NO;
                            self.loadIngView.hidden = YES;
                            isLoadingData = NO;
                        });
                        return ;
                    }

                }

                if (![myDic[@"fromId"] isEqualToString:[User sharedUser].account]) {
                    [messageFromOtherArray addObject:myDic];
                }

                if (_chatRoomType == ChatRoomTypeGroup) {
                    [myDic setObject:@"1" forKey:@"isGroupMessage"];
                }

                [myDic setObject:@"1" forKey:@"did_I_Read"];

                [messageAllArray addObject:myDic];
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                [self setupViewWithMessageArray:messageAllArray]; //???? Here server sync-up data with tableview
            });
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
                if (_chatRoomType == ChatRoomTypePrivate) {
                    if (messageFromOtherArray.count > 0 amp;amp; isUplaodLastRead == NO) {
                        isUplaodLastRead = YES;
                        NSDictionary *lastReadMsgDic = messageFromOtherArray.lastObject;
                        [self callMsgReadAPI:lastReadMsgDic];
                    }
                } else {
                    if (messageAllArray.count > 0 amp;amp; isUplaodLastRead == NO) {
                        isUplaodLastRead = YES;
                        NSDictionary *lastReadMsgDic = messageAllArray.lastObject;
                        [self callMsgReadAPI:lastReadMsgDic];
                    }
                }

                self.chatModel.channelTopic = _topic;

                NSArray *read_arr=resultDataDic[@"read_arr"];
                [self dealMySendMessageReadedWithReadArray:read_arr AndMessageArray:messageAllArray];

                [self saveMessageWithArray:messageAllArray]; //???? Here server sync-up data with local db
           });            
        });
    }
}
  

Эти строки синхронизируют данные с сервера в tableview

 dispatch_async(dispatch_get_main_queue(), ^{
                    [self setupViewWithMessageArray:messageAllArray]; //???? Here server sync-up data with tableview
                });
  

Здесь ниже приведен метод setupViewWithMessageArray

 - (void)setupViewWithMessageArray:(NSArray *)messageAllArray {
    if (!isFirstTimeUpdate) {
        isFirstTimeUpdate = YES;
        self.chatModel.dataSource = nil;
        [self.chatTableView reloadData];
        self.chatModel.dataSource = [[NSMutableArray alloc] init];
        [self addMessageWithArray:messageAllArray];
        [self.chatTableView reloadData];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.chatModel.dataSource.count-1 inSection:0];
        [self.chatTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
    } else {
        [self addMessageWithArray:messageAllArray];
        [self reloadTableViewWithoutMove];
    }
    self.loadIngView.hidden = YES;
    isLoadingData = NO;
    if (_chatRoomType == ChatRoomTypePrivate) {
        if (lastReadMessageId) {
            [self.chatModel setPrivateChatListAllReadFormMessageId:lastReadMessageId];
        }        
    }
}
  

Эта строка синхронизирует данные с сервера в локальную базу данных

 [self saveMessageWithArray:messageAllArray]; //???? Here server sync-up data with local db
  

Здесь ниже приведен метод saveMessageWithArray

 - (void)saveMessageWithArray:(NSArray *)messageArray {
    for (NSDictionary *myDic in messageArray) {
        if (![[FMDBManager sharedInstance] didMessageExistWithMessageID:[myDic objectForKey:@"messageId"]]) {
            [[FMDBManager sharedInstance] SaveMessage:myDic];
        }
        else {
            NSString *mid=[NSString stringWithFormat:@"%@",myDic[@"messageId"]];
            NSString *isRead = myDic[@"isReaed"];
            if (isRead) {
                [[FMDBManager sharedInstance] UpdateisReadWithMessageID:mid];
            }
        }

    }
}
  

Итак, я думаю, теперь мой вопрос в том, как я могу обновить messageAllArray с помощью arrayToDelete перед синхронизацией сервера?

Комментарии:

1. Ничто в приведенном вами коде или описании не имеет никакого отношения к MQTT, в нем говорится только о коде вашего приложения и, возможно, SQLite. Обновите вопрос, указав, почему вы считаете, что это связано с MQTT, и пример кода о том, как вы подписываетесь и публикуете сообщения

2. @hardillb Я обязательно обновлю вопрос. Я пытаюсь понять код, связанный с MQTT для этого вопроса, но теперь я не знаю, какая часть кода актуальна. Я предполагаю, что теперь я удалил сообщения в локальной базе данных методом deleteMessageByMessageId, но как только я выхожу и повторно захожу в чат, эти сообщения все еще там. Я не уверен, подключается ли где-нибудь к брокеру и синхронизирует данные с сервера, на котором эти сообщения не удаляются (они удаляются только в локальной базе данных). Пожалуйста, потерпите, я впервые использую MQTT.

3. Вам действительно нужно отредактировать вопрос и добавить код, который публикует сообщения.