Обновление базы данных в реальном времени в iOS и перезагрузка табличного представления с данными diff дает рывок в прокрутке табличного представления - PullRequest
0 голосов
/ 28 сентября 2018

В моем приложении есть база данных реального времени.При получении различий обновленного или добавленного дочернего элемента я обновляю элементы представления в табличном представлении определенного контроллера 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...