В моем приложении есть база данных реального времени.При получении различий обновленного или добавленного дочернего элемента я обновляю элементы представления в табличном представлении определенного контроллера View, который находится внутри TabViewController.
Для обновления я вызываю метод reloadData для этого табличного представления.В свою очередь, происходит следующее: в свитке Tableview лаг, поскольку RTD очень быстро сменяет друг друга , и в моем tableview более 50+ ячеек.Обновление каждого элемента с помощью данных RTD json оставляет заметную задержку при прокрутке табличного представления.
Ниже приведен код для получения и отправки данных RTD на контроллер View
//Register For FCM Database
- (void) registerForFCMDatabase {
_ref = [[FIRDatabase database] reference];
_refHandle = [[_ref child:@“xyzzy”] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) {
NSDictionary *postDict = snapshot.value;
if(postDict) {
[self fillRTDResponseModel:postDict];
}
}];
_refHandle = [[_ref child:@“xyzzy”] observeEventType:FIRDataEventTypeChildChanged withBlock:^(FIRDataSnapshot *snapshot) {
NSDictionary *postDict = snapshot.value;
if(postDict) {
[self fillRTDResponseModel:postDict];
}
}];
}
//Fill RTD
- (void) fillRTDResponseModel: (NSDictionary *) dict {
RTDResponseModel *response = [[RTDResponseModel alloc] initWithDictionary:dict];
if(response) {
UIViewController *vc = self.window.rootViewController;
BOOL isTabbar = ([vc isKindOfClass:[UITabBarController class]] || [vc isKindOfClass:[UINavigationController class]]);
if (isTabbar) {
UINavigationController *navController = (UINavigationController *)[tabBarController.viewControllers objectAtIndex:tabBarController.selectedIndex];
// car details update
UIViewController *abController = [self findObjectINViewController:navController.viewControllers classObject:[ABVC class]];
if (abViewController != nil && [abViewController isKindOfClass:[ABViewController class]] && [ABViewController instancesRespondToSelector:@selector(checkRTDExistInListingArrayInPage:andCarId:)]) {
[(ABViewController *) abViewController checkRTDExistInListingArrayInPage:response andId:response.idHere];
}
}
}
}
Ниже приведен код для обновления данных с использованием RTD для перезагрузки таблицы.
@objc public func checkRTDExistInListingArrayInPage:response(rtdResponse: RTDResponseModel, andId idHere: Int) {
//Code to update the index of the array
for i in 0..<arrayModel.count {
if (arrayModel.object(at:i) as! MyModel).productId == idHere {
(arrayModel.object(at:i) as! MyModel).valueToUpdate = rtdResponse.value
}
}
let visibleIndexPathArray: NSArray = tableView.indexPathsForVisibleRows! as NSArray
for itemIndexPath in visibleIndexPathArray {
let visibleIndexPath = itemIndexPath as! NSIndexPath
if (visibleIndexPath == calculatedIndexPath) {
let indexPaths = NSArray.init(object: indexPath)
UIView.setAnimationsEnabled(false)
self.tableView.reloadRows(at: indexPaths as! [IndexPath], with: .none)
UIView.setAnimationsEnabled(true)
return
}
}
}
Я пытался выполнить асинхронную загрузку просмотра таблицы, что дало некоторую выгоду, как это предлагалось на некоторых форумах, но все же есть преобладающее подергивание прокрутки таблицы.
DispatchQueue.main.async {
let indexPaths = NSArray.init(object: indexPath)
UIView.setAnimationsEnabled(false)
self.tableView.reloadRows(at: indexPaths as! [IndexPath], with: .none)
UIView.setAnimationsEnabled(true)
}